1.3.4 规则
a. 不能使用 retain/release/retainCount/autorelease
b. 不能使用 NSAllocateObject/NSDeallocateObject
c. 需遵守内存管理的方法命名规则
以 alloc/new/copy/mutableCopy 开头的方法,必须给调用方返回应持有的对象。以 init 开头的方法,必须是实例方法,必须返回一个对象。(我自己试了下,现在,也就是iOS 10.1,xCode 8.1,macOS Sierra 10.12.1,要求没那么严格了,首先是上述几个关键字开头的方法,只要不是和这些关键字开头的系统方法冲突的,都是可以不遵守本规则的,而且我创建了一个 + (void)copy和- (void)alloc都是可以的)
d. 不能显式调用 dealloc
但是可以重写 dealloc方法,且在方法中不必调用[super dealloc]
e. 在 ARC 有效时,使用 @autorelease 代码块而不是 NSAutoreleasePool
d. 不能使用 NSZone 。
因为 NSZone 在很早的版本前的运行时系统中就被忽略了
f. 在 C 语言结构体中不可使用 OC 对象做属性
ARC把内存管理工作交给编译器来管理,因此 LLVM 必须知道对象的生命周期。虽然 C 语言的自动变量(局部变量)可通过作用域来管理对象,但是对于 C 语言结构成员来说,这在标准上是基本不可实现的。
如果必须的话 可使用 __unsafe_unretain 来修饰变量,但要确保变量使用时是有值的
g. 显式转换 id 和 void *
单纯的调用 可使用 __bridge 修饰符。但是 __bridge 的安全性和 __unsafe_unretained 一样,所以我们应该更多的使用 __bridge_retained 和 __bridge_transfer
1.3.4 完