1. __weak修饰符的优点,除了解决循环引用的问题,在持有某对象的弱引用时,若该对象被废弃,则此弱引用将自动失效并且处于nil被赋值的状态(空弱引用)。
如:
id __wark obj1 = nil;
{
id _strong obj0 = [[NSObject alloc] init];
obj1 = obj0;
NSLog(@"A: %@", obj1);
}
NSLog(@"B: %@", obj1);
A:
B:(null)
2. 尽管ARC式的内存管理时编译器的工作,但附有 __unsafe_unretained 修饰符的变量不属于编译器的内存管理对象。
3. __weak 修饰符只能用于ios5以上以及OS X Lion 以上版本的应用程序。
4.将生成的对象直接赋给__weak 或者__unsafe_unretained 的变量会产生警告 [-Warc-unsage-ratained-assign];
需将强引用的对象赋值给__weak 或者__unsafe_unretained 的变量。
5. 在ARC下,使用@autoreleasepool块来替代“NSAutoreleasePool类对象生成、持有及废弃”这一范围。
@autoreleasepool {
id _autoreleaseing obj = [[NSObject alloc] init];
}
同时随着@autoreleasepool块的结束,注册到autoreleasepool中的所有对象被自动释放。因为对象的所有者不存在,所以废弃对象。
@autoreleasepool {
id _strong obj = [NSMutableArray array];
}
7. 为了防止_weak 变量在访问引用对象的过程中,该对象有可能被废弃,故而把要访问的对象注册到autoreleasepool中,那么在@autoreleasepool块结束之前都能确保该对象存在。
8. id *obj 的全式是 id _autoreleasing *obj;
同样的是: NSObject **obj 为 NSObject *__autoreleasing * obj;
- (BOOL)performOperationWithError:(NSError **)error;
- (BOOL)preformOperationWithError:(NSError * __autoreleasing *)error;
- (BOOL)preformOperationWithError:(NSError * __autoreleasing *)error;
{
//error
*error = [[NSError alloc] initWithDomain:MyAppDomain code:errorCode userInfo:nil];
return NO;
}
NSError *error = nil;
BOOL result = [obj performOperationWithError:&error];
NSError __strong *error = nil;
NSError __autoreleasing *tmp = error;
BOOL result = [obj performOperationWithError:&tmp];
error = tmp;
10. 显示指定__autoreleasing 修饰符时,必须注意对象变量要为自动变量(包括局部变量、函数以及方法参数)。
11. 打印autoreleasepool 的调试信息
// 函数声明
extern void _objc_autoreleasePoolPrint();
// 开始调试
_objc_autoreleasePoolPrint();
12. ARC规则
①不能使用 retain、release、reatainCount/autorelease
②不能使用 NSAllocateObject/NSDeallocateObject;
③需遵守内存管理的方法命名规则
(alloc/new/copy/mutableCopy)
④不要现实调用dealloc
⑤使用@autoreleasepool块代替NSAutoreleasePool
⑥不能使用区域(NSZone)
⑦对象型变量作为C语言结构体(struct/union)的成员
因为ARC把内存管理的工作分配给编译器,所以编译器必须能够知道并管理对象的生存周期。
C语言的自动变量(局部变量)可使用该变量的作用域管理对象。
但对于C语言的结构体成员来说,这在标准上是不可实现的。
但可以强制转换为 void *,或者附加 __unsafe_unretained 修饰符。
(附有 __unsafe_unretained 修饰符的变量不属于编译器的内存管理对象。)
struct Data{
NSMutableArray __unsafe_unretained *array;
};
⑧显示转换(id) 和(void*)
非ARC下两者可以转换,在ARC下两者的转换需借助 __bridge
id obj = [[NSObject alloc] init];
void *p = (__bridge void *)obj;
id o = (_bridge id)p;
扩展:__btidge_retained __bridge_transfer
13. GNUstep 跟 cocoa 框架可以替换。