美文网首页iOS基础学习
Objective-C基础学习之ARC下的内存管理

Objective-C基础学习之ARC下的内存管理

作者: WenJim | 来源:发表于2017-10-10 16:12 被阅读7次

    1.ARC下单对象内存管理

    • 局部变量释放对象随之被释放
    int main(int argc, const char * argv[]) {
       @autoreleasepool {
            Person *p = [[Person alloc] init];
        } // 执行到这一行局部变量p释放
        // 由于没有强指针指向对象, 所以对象也释放
        return 0;
    }
    
    • 清空指针对象随之被释放
    int main(int argc, const char * argv[]) {
       @autoreleasepool {
            Person *p = [[Person alloc] init];
            p = nil; // 执行到这一行, 由于没有强指针指向对象, 所以对象被释放
        }
        return 0;
    }
    
    • 默认清空所有指针都是强指针
    int main(int argc, const char * argv[]) {
       @autoreleasepool {
            // p1和p2都是强指针
            Person *p1 = [[Person alloc] init];
            __strong Person *p2 = [[Person alloc] init];
        }
        return 0;
    }
    
    • 弱指针需要明确说明
      • 注意: 千万不要使用弱指针保存新创建的对象
    int main(int argc, const char * argv[]) {
       @autoreleasepool {
            // p是弱指针, 对象会被立即释放
            __weak Person *p1 = [[Person alloc] init];
        }
        return 0;
    }
    

    2.ARC下多对象内存管理

    • ARC和MRC一样, 想拥有某个对象必须用强指针保存对象, 但是不需要在dealloc方法中release
    @interface Person : NSObject
    
    // MRC写法
    //@property (nonatomic, retain) Dog *dog;
    
    // ARC写法
    @property (nonatomic, strong) Dog *dog;
    
    @end
    

    3.ARC下循环引用问题

    • ARC和MRC一样, 如果A拥有B, B也拥有A, 那么必须一方使用弱指针
    @interface Person : NSObject
    
    //@property (nonatomic, retain) Dog *dog;
    @property (nonatomic, strong) Dog *dog;
    
    @end
    
    @interface Dog : NSObject
    
    // 错误写法, 循环引用会导致内存泄露
    //@property (nonatomic, strong) Person *owner;
    
    // 正确写法, 当如果保存对象建议使用weak
    //@property (nonatomic, assign) Person *owner;
    @property (nonatomic, weak) Person *owner;
    @end
    

    4.ARC下@property参数

    • strong : 用于OC对象, 相当于MRC中的retain
    • weak : 用于OC对象, 相当于MRC中的assign
    • assign : 用于基本数据类型, 跟MRC中的assign一样

    相关文章

      网友评论

        本文标题:Objective-C基础学习之ARC下的内存管理

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