内存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都是可以的,都是在堆区
网友评论