《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 一般都是隐形使用
- 当方法名 不是以 alloc/new/copy/mutableCopy开始
编译器会自动把返回值的对象注册到 autoreleasePool 中
如:NSMutableArray *arr = [NSMutableArray array]; - __weak 修饰的变量,会被注册到 autoreleasePool 中
- 对象的指针会自动加上 __autoreleaseing 修饰符
如: NSObject **obj 相当于 NSObject * __autoreleaseing
- 当方法名 不是以 alloc/new/copy/mutableCopy开始
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
网友评论