ios开发:OC对象的内存分析
2015-03-30 15:58
183 查看
最近要开始准备找实习单位了,做做笔试题,看看各位大神的面试经历,发现自己要学习的东西真的还有很多,虽然也做过几个的项目,但是真正拿过笔试题一看,才发现自己对基础这方面的东西,确实有点忽视了,所以最近开启恶补模式。
这几天在研究ios内存分析这一块,才发现自己原来忽视了这么多重要的东西,在这里和大家分享一下。
先来看一段代码:
这是一段最简单的字符串定义,但是看似简单,其实有很多东西可能会被忽略掉
1.这里的s其实是个指针,在oc中除了基本数据类型之外的变量类型都是指针类型,oc的对象也是通过指针进行操作的。
2. 在第一段代码定义了NSString类型的指针变量,但是并没有指向任何对象,第二段代码alloc一个NSString对象 然后使s指向它,并通过s开始其的后续操作。
3. 这里s的内存空间在栈内存中,“hello ios”在堆内存中。
下面通过图示说明一下
再来看一个例子
内存分布情况
看到这里大家也就能明白了,oc中创建的对象指针存储在栈内存中,而alloc出来的对象的内存在堆内存中,栈内存中的指针通过赋值指向堆内存中的对象,然后通过栈内存中的指针访问对象及其变量,也就是说,其实我们在创建一个对象时其实是利用了两个部分的内存空间。
这几天在研究ios内存分析这一块,才发现自己原来忽视了这么多重要的东西,在这里和大家分享一下。
先来看一段代码:
NSString* s; s = [[NSString alloc] initWithString:@"hello ios"];
这是一段最简单的字符串定义,但是看似简单,其实有很多东西可能会被忽略掉
1.这里的s其实是个指针,在oc中除了基本数据类型之外的变量类型都是指针类型,oc的对象也是通过指针进行操作的。
2. 在第一段代码定义了NSString类型的指针变量,但是并没有指向任何对象,第二段代码alloc一个NSString对象 然后使s指向它,并通过s开始其的后续操作。
3. 这里s的内存空间在栈内存中,“hello ios”在堆内存中。
下面通过图示说明一下
再来看一个例子
@interface C: NSObject { int a; int b; } @end int main(int argc, const char *argv[]) { C *c1 = [[C alloc]init]; C *c2 = [[C alloc]init]; }
内存分布情况
看到这里大家也就能明白了,oc中创建的对象指针存储在栈内存中,而alloc出来的对象的内存在堆内存中,栈内存中的指针通过赋值指向堆内存中的对象,然后通过栈内存中的指针访问对象及其变量,也就是说,其实我们在创建一个对象时其实是利用了两个部分的内存空间。
相关文章推荐
- iOS开发OC基础:OC字符串对象NSString对象方法使用基础
- 小白学开发(iOS)OC_类和对象(2015-07-22)
- 【IOS 开发学习总结-OC-18】★★objective-c面向对象之——OC的包装类与对象处理
- IOS开发之—— Core Foundation对象与OC对象相对转换的问题
- iOS开发--OC对象模型你必须知道的几条规则
- iOS开发OC基础:NSNumber对象方法的使用
- iOS开发-OC-类、对象、方法
- 【无限互联】iOS开发视频教程 — 3.2 类的声明和对象的创建—内存分析1
- 黑马程序员——ios开发基础之OC中的面向对象以及对象特性
- iOS开发学习_OC基础_(一).类、对象和方法(1)
- 黑马程序员_iOS开发之OC之面向对象之思想、类和对象
- 小白学开发(iOS)OC_多个对象的内存管理(2015-08-03)
- 小白学开发(iOS)OC_匿名对象(2015-07-24)
- 【IOS 开发学习总结-OC-27】★★objective-c之foundation 框架——对象复制
- iOS开发OC基础:OC数组对象NSArray的常用方法 推荐
- 黑马程序员——零基础学习iOS开发——10 Object-C 面向对象思想、OC语法简介、对象、类、
- 小白学开发(iOS)OC_self 与 类方法 和 对象方法(2015-07-25)
- 小白学开发(iOS)OC_ 单个对象的内存管理(2015-08-02)
- IOS 开发 OC编程 类和对象
- 【IOS 开发学习总结-OC-37】★文件 I/O——对象归档