1、
id __strong obj = [NSMutableArray array];
[NSMutableArray array]返回的对象自动注册到autoreleasePool
(
编译器检查方法是否以alloc/new/copy/mutableCopy开头,不是则加到autoreleasePool 。
init方法返回的对象不注册到autoreleasePool。
)
也可以这么理解,[NSMutableArray array]其实是函数返回值,函数返回值都会注册到autoreleasePool,否则函数返回后,返回的对象也没了。
编译器模拟代码:
id obj = objc_msgSend(NSMutableArray,@selector(array));
objc_retainAutoreleasedReturnValue(obj);
objc_release(obj);
objc_retainAutoreleasedReturnValue这个函数retain函数返回值或者某个方法,这个方法返回注册到autoreleasePool中的对象。
再看下[NSMutableArray array]的代码:
+(id) array
{
id obj = objc_msgSend(NSMutableArray,@selector(alloc));
objc_msgSend(obj,@selector(init));
return objc_autoreleaseReturnValue(obj);
}
objc_autoreleaseReturnValue函数注册对象到autoreleasePool中,但是这个方法能检查函数调用方的执行命令列表,如果之后紧接着调用objc_retainAutoreleasedReturnValue,就不将对象注册到pool中,而是直接传递。达到过程最优化。问题是为什么要
2、
注意生成的NSObject对象会立即释放,因为它赋给了weak型变量,没有retain者。
接下来NSLog(@"%@",obj);打印出nil
3、
将对象赋值给__autoreleasing对象相当于将该对象加入autoreleasePool
@autoreleasepool{
id __autoreleasing obj = [[NSObject alloc] init];
}
疑惑,这里是不是可以不用@autoreleasepool一样能注册到pool?感觉应该是可以的,@autoreleasepool只是保证pool立即释放?
4、
使用__weak变量,即是使用注册到autoreleasePool中的对象。
{
id __weak obj1 = obj;
NSLog("%@",obj1); //使用weak变量
}
在使用weak变量前有这样的转换
id obj1;
objc_initWeak(&obj1,obj);
id tmp =objc_loadWeakRetained(&obj1); //取出weak变量,tmp变量对其retain
objc_autorelease(tmp); //将tmp对象注册到autoreleasePool中
objc_destroyWeak(&obj1);
结果是obj retainCount+1
如果大量使用该weak变量,每次使用都会注册到pool中,所以可以将weak变量赋给strong类型变量再多次使用:
{
id __weak obj1 = obj;
id tmp = obj1;
NSLog("%@",tmp); //使用weak变量
}