读书笔记(一)

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变量

}

你可能感兴趣的:(读书笔记(一))