iOS __weak學習碰到的疑問

來源:互聯網
上載者:User

標籤:__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學習碰到的疑問

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.