美文网首页
【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