OC – 内存管理笔记

内存管理笔记

  • 在MRC中重写- dealloc方法时必须调用 [super dealloc],且放在最后。这是因为对象创建的时候先创建父对象后创建自身,所以当对象销毁时先销毁自己,再去销毁父对象。
  • 手动内存管理的黄金法则

    谁调用new, alloc, retain, copy, multableCopy, 谁就要调用对应的release或者autorelease

  • - (void)setA🙁A *)a {
        //如果不相同才需要内存管理
        if(_a != a){
            [_a release];
            _a = a;
            [a retain];
        }
    }
    //@property(retain) 可以省略上述内存管理代码
  • release之后记住指向nil,防止产生野指针。
  • @property() 内存管理的关键词
    • retain 普通OC对象
    • assign 基本数据类型,直接赋值,不生成内存管理代码
    • copy 字符串,复制对象
    • 线程安全代码
      • nonatomic:非原子,不会生成线程安全代码,运行速度快。
      • atomic:原子(默认),会生成线程安全代码
    • 控制权限代码
      • readwriter:可读可写,会生成getter和setter方法
      • readonly:只读,只生成getter方法
    • 修改方法名称
      • getter=新的方法名,用此方式修改getter方法名
      • setter=新的方法明: ,冒号表示传参,一般不去修改setter方法名
  • 关于为什么使用了 上述内存管理代码之后为什么在- dealloc方法中无须使用release,因为使用setter时如果与之前不一样就先把之前的release了,所以 恰恰可以实现成员的release
  • autorelease 延长对象的生命周期,把对象放到最近的自动释放池中。当自动释放池销毁的时候,它会对放在其中的所有对象进行一次release
  • 自动释放池栈中,只有栈顶的释放池是是活跃的,底部的是休眠状态。当调用autorelease时会被放到栈顶的释放池中(实际就是就近原则)。
  • ARC是编译器特性
  • 在ARC中dealloc中无须去调用super。
  • ARC中通过方法返回的对象放在自动释放池中。(有待理解)