日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

iOS: 属性声明strong和retain竟然不一样

發(fā)布時(shí)間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS: 属性声明strong和retain竟然不一样 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天和同事在處理一處用strong聲明的Block屬性引發(fā)的問題時(shí)偶然發(fā)現(xiàn)的。在諸多教程中都會(huì)講到:聲明屬性時(shí)用strong或者retain效果是一樣的(貌似更多開發(fā)者更傾向于用strong)。不過在聲明Block時(shí),使用strong和retain會(huì)有截然不同的效果。strong會(huì)等于copy,而retain竟然等于assign!

當(dāng)然定義Block還是應(yīng)該用copy(還有其他需要注意的地方,可以參考這篇文章:iOS: ARC和非ARC下使用Block屬性的問題),因?yàn)榉茿RC下不copy的Block會(huì)在棧中,ARC中的Block都會(huì)在堆上的。

?

可以這樣復(fù)現(xiàn)問題。在非ARC環(huán)境下,定義一個(gè)簡(jiǎn)單類型,定義一個(gè)Block屬性,先用正確的copy:

1 @interface TestCls : NSObject 2 3 @property (nonatomic, copy) void(^myBlock)(); 4 5 @end

?

在另一個(gè)類型里聲明變量:

?1 TestCls *_testObj?

然后在一個(gè)方法里,比如viewDidLoad中,設(shè)置Block變量,注意即便是在非ARC下,沒有引用外部變量的Block類型也是__NSGlobalBlock__,而引用外部變量的Block才是__NSStackBlock__,如下代碼:

1 _testObj = [[TestCls alloc] init]; 2 3 int outerVar = 12; 4 5 _testObj.myBlock = ^void() 6 { 7 NSLog(@"Block被調(diào)用:%d", outerVar); 8 }; 9 NSLog(@"Block類型:%@", [_testObj.myBlock class]);

然后在另一個(gè)方法里(比如UIButton的點(diǎn)擊事件方法里)去執(zhí)行Block,如下:

?1 _testObj.myBlock();??

測(cè)試環(huán)境是Xcode 6/iOS 7/8,如果最上面myBlock屬性聲明是copy或者strong的話,Block都會(huì)被copy,輸出:

?Block類型:__NSMallocBlock
__ Block被調(diào)用:
12
?

?

如果上面myBlock屬性聲明是retain或者assign的話,Block表現(xiàn)起來(lái)就是assign,沒有去copy,輸出:

?Block類型:__NSStackBlock__?

此時(shí)可能會(huì)Crash(BAD_ACCESS),也有可能輸出錯(cuò)誤的值(我在控制臺(tái)下測(cè)試會(huì)出現(xiàn)這種情況)。因?yàn)锽lock作用域在函數(shù)棧里,而函數(shù)已經(jīng)執(zhí)行完畢了。?

?

總之,strong和retain竟然有不一樣的地方,而聲明Block屬性請(qǐng)務(wù)必用copy。

?

轉(zhuǎn)載于:https://www.cnblogs.com/fengmin/p/5390073.html

總結(jié)

以上是生活随笔為你收集整理的iOS: 属性声明strong和retain竟然不一样的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。