1.3.5 屬性
assign __unsafe_unretained
copy __strong(強引用對象的副本)
strong __strong
retain __strong
weak __weak
一個類的成員變量和屬性是同一類型
時死相,修飾符必須一致
1.3.6 數(shù)組
靜態(tài)數(shù)組超出其作用域時谋竖,數(shù)組中各個附有 __strong 修飾符的變量失效懈词,其強引用消失,所賦值的對象隨之釋放。
編譯器能夠根據(jù)靜態(tài)數(shù)組中的變量的作用域自動插入釋放賦值對象的代碼,而在動態(tài)數(shù)組中,編譯器不能確定數(shù)組的生存周期些膨,所以無從處理。所以一定要將 nil 賦值給所有元素分歇,使所有元素所賦值對象的強引用失效傀蓉,從而釋放那些對象。
1.3 完
1.4 ARC 實現(xiàn)
1.4.1 __strong 修飾符
本章講 __strong 修飾符在程序中是如何運行的职抡。
id __strong obj = [[NSObject alloc] init];
編譯器的模擬代碼如下
id obj = objc_msgSend(NSObject, @selecor(alloc));
objc_msgSend(obj, @selector(init));
調(diào)用兩次 objc_msgSend 方法葬燎,然后編譯器自動插入 objc_release 方法。然后對比其他獲取強引用的方法
id __strong obj = [NSMutableArray array];
編譯器模擬代碼
id obj = objc_msgSend(NSMutalbleArray, @selector(array));
objc_retainedAutoreleasedReturnedValue(obj);
objc_release(obj)
這個過程中調(diào)用了 objc_retainedAutoreleasedReturnedValue 方法缚甩,這個方法主要用于最優(yōu)化程序谱净。這個方法一般和 objc_autoreleasedReturnedValue 方法成對出現(xiàn)。
+? (id) array {
return [[NSObject alloc] init]擅威;
}
以下是模擬代碼
+? (id) array {
id obj = objc_msgSend(NSMutableArray, @selector(alloc));
objc_msgSend(obj, @selector(init));
return objc_autoreleaseReturndValue(obj);
}
objc_autoreleaseReturndValue方法執(zhí)行后會檢查調(diào)用方的執(zhí)行命令列表壕探,如果有 objc_retainedAutoreleasedReturnedValue 方法則會繞過 autoreleasepool 直接返回生成的對象
1.4.2 __weak 修飾符
__weak 的功能
a. 若附有 __weak 修飾符的變量所以用的對象廢棄,則將 nil 賦值給該變量郊丛。
b. 使用附有 __weak 修飾符的變量李请,即是使用注冊到 autoreleasepool 中的對象。
__weak a功能的實現(xiàn)
{
id __weak obj1 = obj;
}
模擬代碼{
id obj1;
objc_initWeak(&obj1, obj);
objc_destroyWeak(&obj1);
}
objc_initWeak 和 objc_destroyWeak 方法實際上是調(diào)用 objc_storeWeak 方法厉熟,上面的模擬代碼可以轉(zhuǎn)換為
{
id obj1;
obj1 = 0;
objc_store(&obj1, obj);
objc_store(&obj1, 0);
}
objc_store(&obj1, obj) 將 obj 的地址當做 key 第一參數(shù)即 weak 變量的地址注冊到 weak 表中导盅,當?shù)诙?shù)為0時將 weak 變量地址從 weak表中移除。
由于一個對象可以被多個weak變量引用揍瑟,所以白翻,weak表中一個對象可以注冊多個 weak 變量的地址。當對象廢棄時會首先從 weak 表中獲取引用記錄绢片,然后逐一賦值nil滤馍,過后從 weak 表中刪除該記錄岛琼,最后在引用計數(shù)表中刪除以廢棄對象為鍵值的記錄
__weak b功能的實現(xiàn)
{
id __weak obj1 = obj;
NSLog(@“%@”, obj1);
}
模擬代碼
id obj1;
objc_initWeak(&obj1, obj);
id temp = objc_loadWeakRetained(&obj1)
objc_autorelease(tmp);
NSLog(@“%@”, tmp);
objc_destroyWeak(&obj1);
1.4.3 __autorelease 修飾符?
略
1.4.4 retainCount
略