美文网首页
【iOS知识体系】OC内存管理

【iOS知识体系】OC内存管理

作者: xiari1991 | 来源:发表于2020-05-17 19:04 被阅读0次

内存5区域:代码区、常量区、静态区(全局区)、堆区、栈区

函数

字符串:

NSString *str1 = @"abc";
NSString *str2 = [NSString stringWithString:@"abc"];
NSString *str3 = [[NSString alloc] initWithString:@"abc"];
这三种方式创建的字符串都是在常量区,地址都是相同的'

NSMutableString *str8 = [[NSMutableString alloc] initWithString:@"abc"]; 
NSMutableString *str9 = [NSMutableString stringWithFormat:@"abc"];
这两种方式是在堆区,地址不一致。

NSString *str10 = [NSString stringWithFormat:@"地方"];//其中有汉字,是unicode,在堆区

 NSString *str4 = [NSString stringWithFormat:@"1"];
地址超级大,不知道什么区,查资料说该字符串类型是NSTaggedPointerString,地址表示的不是真的地址,是表示的字符串的值
数组
NSArray *arr = [NSArray array]
NSArray *arr = [[NSArray alloc] init];
NSArray *arr = @[];
上述方式都是在栈区,地址相同

NSArray *arr = @[@"xx"];
数组中有数据的在堆区
对象:

都是在堆区

Animal *animal = [[Animal alloc] init];
printf("animal = %p \n", animal);
block:

分三种:_NSConcreteGlobalBlock、_NSConcreteStackBlock、_NSConcreteMallocBlock

_NSConcreteGlobalBlock:不会访问外部局部变量,存储在静态区

void (^block)(void) = ^() {      
};

_NSConcreteStackBlock:MRC下,如果内部引用了外部的局部变量

_NSConcreteMallocBlock,ARC下内部引用了外部的局部变量下储存在堆区,无论是ARC还是MRC,对block copy都存储在堆区

为什么使用copy

MRC:Block的内存地址显示在栈区,栈区的特点就是创建的对象随时可能被销毁,一旦被销毁后续再次调用空对象就可能会造成程序崩溃,在对block进行copy后,block存放在堆区.所以在使用Block属性时使用copy修饰。但是ARC中的Block都会在堆上的,系统会默认对Block进行copy操作。用copy,strong修饰block在ARC和MRC都是可以的,都是在堆区

相关文章

网友评论

      本文标题:【iOS知识体系】OC内存管理

      本文链接:https://www.haomeiwen.com/subject/zgejohtx.html