__block和非__block

自己的筆記:

NSString *text = @"test";

testBlock block = ^{

dispatch_queue_t t = dispatch_queue_create("test", NULL);

dispatch_sync(t, ^{

NSLog(@"text==%p",text);

NSLog(@"&text==%p",&text);

NSLog(@"%@",text);

});

};

NSLog(@"text==%p",text);

NSLog(@"&text==%p",&text);

text = @"test1";

NSLog(@"text==%p",text);

NSLog(@"&text==%p",&text);

block();

打印出來的數(shù)據(jù)依次是:

text==0x105c61140

&text==0x7fff59f9f9f8

text==0x105c611c0

&text==0x7fff59f9f9f8

text==0x105c61140

&text==0x7fff59f9f970

test

可以看出來,block里的text和未改變值之前的text指向?qū)ο蟮牡刂范际?x105c61140,但是指針的地址是發(fā)生改變的。原因是block里訪問外部變量的時(shí)候,都會(huì)把指針進(jìn)行拷貝,并且這個(gè)步驟應(yīng)該是在編譯過程就發(fā)生了。

如果改成一下代碼

__block NSString *text = @"test";

打印依次是:

text==0x10a0db170

&text==0x60800005ba78

text==0x10a0db1f0

&text==0x60800005ba78

text==0x10a0db1f0

&text==0x60800005ba78

“test1”

這里可以看出指針text的地址都是0x60800005ba78,也就是說加了__block的外部對(duì)象在block內(nèi)部是指針引用,所以在block內(nèi)部打印text的時(shí)候,通過指針找到的對(duì)象是test1.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,576評(píng)論 0 35
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,844評(píng)論 0 4
  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景。SDWebImage的原...
    LZM輪回閱讀 2,124評(píng)論 0 12
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,253評(píng)論 0 7
  • 沒有學(xué)過彩鉛畫,自己隨便畫畫,如果哪位親有教程,還望分享一下,謝謝!
    時(shí)光蓮心閱讀 291評(píng)論 1 4

友情鏈接更多精彩內(nèi)容