iOS - 内存管理

《Objective-c 高级编程 iOS 与 OSX 多线程和内存管理》 读书笔记

书籍地址: 链接: https://pan.baidu.com/s/1JiQjmv7Hf8IPhKIA8v-2kQ 密码: 7awy


__strong
__weak
__unsafe_unretained
__autoreleasing

  • 只有在 ARC 有效时才有用
  • 涉及到作用域,出了作用域自动销毁

初始化自动为nil;
如:

id __strong obj0;
id __weak obj1;
id __autoreleasing obj2;

等同于 
id __strong obj0 = nil;
id __weak obj1 = nil;
id __autoreleasing obj2 = nil;

  • __weak

    • 为什么要有 __weak?

    __strong 会造成循环引用, 用__weak 打破循环引用。
    修饰的对象会自动置nil
    iOS 4.0 之后才可以使用

  • __unsafe_unretained

    不属于编译器管理对象
    对象释放后,还会指向对象的地址(会造成奔溃,要手动置nil)
    职责同 __week 用来打破循环引用

  • __autoreleasing

    • ARC 无效时
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    id obj = [[NSObject alloc] init];
    [obj autorelease];
    [pool drain];
    
    • ARC 有效时
    @autoreleasepool {
        id __autoreleasing obj = [[NSObject alloc] init];
    }
    
    • __autoreleasing 一般都是隐形使用
      1. 当方法名 不是以 alloc/new/copy/mutableCopy开始
        编译器会自动把返回值的对象注册到 autoreleasePool 中
        如:NSMutableArray *arr = [NSMutableArray array];
      2. __weak 修饰的变量,会被注册到 autoreleasePool 中
      3. 对象的指针会自动加上 __autoreleaseing 修饰符
        如: NSObject **obj 相当于 NSObject * __autoreleaseing

ARC 规则

  • 不能使用 retain/release/retainCount/autorelease
  • 不能使用 NSAllocateObject/NSDeallocateObject
  • 必须最受嫩村管理的方法命名规则
  • 不要显示调用 dealloc
  • 使用 @autoreleasepol 块 替换 NSAutoreleasePool
  • 不能使用区域 NSZone
  • 对象变量不能作为 C 语言结构体 sturct/union 成员
  • 显示转换 id 和 void

__bridge 相当于 __unsage_unretained
__bridge_retained 相当于 retain 相当于 CGBridgingRetain
__bridge_transfer 会自动释放被转换的对象同时强引用给被赋值的对象 相当于 CGBridgingRelease


属性修饰词

- assign                    __unsafe_unreatained
- copy                      __strong
- retain                    __strong
- strong                    __strong
- unsafe_unreatained        __unsafe_unreatained
- weak                      __weak

你可能感兴趣的:(iOS - 内存管理)