OC对象的内存分析
2016-09-17 12:46
225 查看
先来看一段代码:
这是一段最简单的字符串定义,但是看似简单,其实有很多东西可能会被忽略掉
1.这里的s其实是个指针,在oc中除了基本数据类型之外的变量类型都是指针类型,oc的对象也是通过指针进行操作的。
2. 在第一段代码定义了NSString类型的指针变量,但是并没有指向任何对象,第二段代码alloc一个NSString对象 然后使s指向它,并通过s开始其的后续操作。
3. 这里s的内存空间在栈内存中,“hello ios”在堆内存中。
下面通过图示说明一下
![](http://images.cnitblog.com/blog2015/688776/201503/301539576075247.png)
再来看一个例子
内存分布情况
![](http://images.cnitblog.com/blog2015/688776/201503/301545206854117.png)
看到这里大家也就能明白了,oc中创建的对象指针存储在栈内存中,而alloc出来的对象的内存在堆内存中,栈内存中的指针通过赋值指向堆内存中的对象,然后通过栈内存中的指针访问对象及其变量,也就是说,其实我们在创建一个对象时其实是利用了两个部分的内存空间。
NSString* s; s = [[NSString alloc] initWithString:@"hello ios"];
这是一段最简单的字符串定义,但是看似简单,其实有很多东西可能会被忽略掉
1.这里的s其实是个指针,在oc中除了基本数据类型之外的变量类型都是指针类型,oc的对象也是通过指针进行操作的。
2. 在第一段代码定义了NSString类型的指针变量,但是并没有指向任何对象,第二段代码alloc一个NSString对象 然后使s指向它,并通过s开始其的后续操作。
3. 这里s的内存空间在栈内存中,“hello ios”在堆内存中。
下面通过图示说明一下
![](http://images.cnitblog.com/blog2015/688776/201503/301539576075247.png)
再来看一个例子
@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]; }
内存分布情况
![](http://images.cnitblog.com/blog2015/688776/201503/301545206854117.png)
看到这里大家也就能明白了,oc中创建的对象指针存储在栈内存中,而alloc出来的对象的内存在堆内存中,栈内存中的指针通过赋值指向堆内存中的对象,然后通过栈内存中的指针访问对象及其变量,也就是说,其实我们在创建一个对象时其实是利用了两个部分的内存空间。
相关文章推荐
- ios开发:OC对象的内存分析
- oc002---定义OC的类和创建OC的对象
- OC单个对象的归档和解归档
- JSON和OC之间对象的转换
- 小白学开发(iOS)OC_类方法和对象方法(2015 b052 -07-22)
- ARC/OC对象自动管理内存
- 黑马程序员--ios基础--oc语言--类和对象
- OC语言学习 (四) SEL对象,用于日志输出的宏
- 黑马程序员-我的第十篇学习日记:OC中点语法,@property和@synthesize,完整创建一个可用对象
- 黑马程序员_OC中对象的复制
- OC基础-NSValue类簇-将复杂数据类型保存为对象
- 黑马程序员--学习OC面向对象特性
- OC对象之旅 weak弱引用实现分析
- 02 OC面向对象基础
- 【OC加强】枚举介绍、数组的排序、对象的排序、如何利用block排序以及一些数据类型知识
- 黑马程序员---OC学习笔记之autorelease快速创建对象的应用
- OC中的类和对象
- 【黑马程序员】【OC语言】创建对象
- iOS-OC对象模型
- OC学习篇之---数组对象的引用计数问题和自动释放池的概念