• ARC下的内存管理


    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 {
            // 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一样
    //
    //  Person.h
    
    
    #import <Foundation/Foundation.h>
    
    @class Dog;
    
    @interface Person : NSObject
    
    // MRC, A对象想拥有B对象, 需要对B对象进行一次retain
    //      A对象不用B对象了, 需要对B对象进行一次release
    //      property的时候进行retain, dealloc的时候进行release
    
    
    // ARC, A对象想拥有B对象, 那么就需要用一个强指针指向B对象
    //      A对象不用B对象了, 什么都不需要做, 编译器会自动帮我们做
    
    
    // 在ARC中保存一个对象用strong, 相当于MRC中的retain
    @property(nonatomic, strong)Dog *dog;
    
    @end
  • 相关阅读:
    git 专题
    Android yyyymmdd转成yyyy-MM-dd格式
    Android LayoutInflater.from(context).inflate
    Android TextView内容过长加省略号,点击显示全部内容
    Android 标题栏封装
    Android 自定义Android带图片和文字的ImageButton
    Android 防止按钮连续点击的方法(Button,ImageButton等)
    Android 动态改变布局属性RelativeLayout.LayoutParams.addRule()
    Android ActionBar的Overlay模式如何不遮盖顶部内容的问题
    Android 时间轴TimeLine
  • 原文地址:https://www.cnblogs.com/xufengyuan/p/6591404.html
Copyright © 2020-2023  润新知