標籤:__weak 記憶體管理 arc __weak學習疑雲
__weak弱引用並不持有對象,所以賦值給__weak修飾符的變數也不會改變計數器的值.
main.m
id __strong obj3 =nil;
id __weak obj1=nil;
/*
id __weak obj1 = obj;
編譯器的類比代碼如下:
id obj1;
objc_iniitWeak(&obj1,obj);
objc_destroyWeak(&obj1);
*/
@autoreleasepool {
id obj = [[NSObjectalloc] init];
obj1 = obj;
obj3 = obj;
NSLog(@"%d",_objc_autoreleasePoolPrint());//在ARC機制下查看POOL池內的內容
NSLog(@"obj retainCount = %ld",CFGetRetainCount((__bridgeCFTypeRef)obj));
NSLog(@"obj1 retainCount = %ld",CFGetRetainCount((__bridgeCFTypeRef)obj1));
NSLog(@"obj3 retainCount = %ld",CFGetRetainCount((__bridgeCFTypeRef)obj3));
}
NSLog(@"obj3 retainCount = %ld",CFGetRetainCount((__bridgeCFTypeRef)(obj3)));
NSLog(@"obj1 retainCount = %ld",CFGetRetainCount((__bridgeCFTypeRef)(obj1)));
NSLog(@"%d",_objc_autoreleasePoolPrint());
/*
列印如下:
objc[1029]: ##############
objc[1029]: AUTORELEASE POOLS for thread 0x7fff7455a300
objc[1029]: 1 releases pending.
objc[1029]: [0x101001000] ................ PAGE (hot) (cold)
objc[1029]: [0x101001038] ################ POOL 0x101001038
objc[1029]: ##############
2015-07-24 23:02:39.686 Objective-C對象與core Foundation對象[1029:100223] 139077936
2015-07-24 23:02:39.687 Objective-C對象與core Foundation對象[1029:100223] obj retainCount = 2-------->>>>>>>(1)
2015-07-24 23:02:39.688 Objective-C對象與core Foundation對象[1029:100223] obj1 retainCount = 3-------->>>>>>>(2)
2015-07-24 23:02:39.688 Objective-C對象與core Foundation對象[1029:100223] obj3 retainCount = 2-------->>>>>>>(1)
2015-07-24 23:02:39.688 Objective-C對象與core Foundation對象[1029:100223] obj3 retainCount = 1-------->>>>>>>(3)
2015-07-24 23:02:39.688 Objective-C對象與core Foundation對象[1029:100223] obj1 retainCount = 2-------->>>>>>>(4)
objc[1029]: ##############
objc[1029]: AUTORELEASE POOLS for thread 0x7fff7455a300
objc[1029]: 0 releases pending.
objc[1029]: [0x101001000] ................ PAGE (hot) (cold)
objc[1029]: ##############
2015-07-24 23:02:39.688 Objective-C對象與core Foundation對象[1029:100223] 139077936
*/
/*
1:由上面(1)可知__weak修飾符修飾的變數並不會持有對象
2:由(3)可知當__strong修飾的變數超出了範圍時,不在持有對象,導致rerainCout - 1;
3:細心的讀者也許已經發現 obj1的retainCount和obj的不一樣呢?(這也是筆者最大的疑惑)
下面介紹筆者的思考過程
(1)__weak修飾的變數雖然是對對象的弱引用,他不改變賦值對象(obj)的引用計數(retainCount),但自身的retainCount會增加. -------->>> 可是他們是指向同一個地址的,為何retainCount不一樣呢?所以這條路不通
(2)雖然他們是同一個地址,但__weak不持有對象,但__weak修飾的變數想使用對象就必須使retainCount + 1,但同時並不改變對象的retainCount.帶著這個疑問最後讓我找到了答案 -->>在通過__weak指標尋找對象的時候,它有一個修飾詞,當使用他的時候就會使返回的retainCount + 1(注意這裡並不是retainCount本身).
4:持不持有一個對象,是看它是否導致對象的retainCount + 1;而不是看他是否指向那個地址.
*/
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
iOS __weak學習碰到的疑問