類屬性,例如:
@interface TestModel
@property (nonatomic, copy) NSString *testStr;
@end
在主執行緒:
for (model in modellist) {
if ((!model.testStr || ![model.testStr isKindOfClass:[NSString class]] || model.testStr.length == 0)) {
NSLog(@"empty str");
}
NSLog(@"not empty str");
}
在后臺執行緒:
for (model in modellist) {
model.testStr = anotherStringFromAlloc
}
在主執行緒:只讀取屬性
在后臺執行緒:寫入屬性內容
這個執行緒安全嗎?
在閱讀了一些源代碼之后,我還有一個問題是: 將 objc_retain 和 objc_release 相同的 obj 設為執行緒安全嗎?
uj5u.com熱心網友回復:
正如 Petesh 所指出的,這個問題主要是在執行緒安全的 retain/release 中回答的,但我認為只是在那里重復會錯過回答你的具體問題。
您已明確要求此屬性不是執行緒安全的:
@property (nonatomic, copy) NSString *testStr;
默認行為是atomic,這使得在不同執行緒上讀取和寫入指標(而不是改變物件)是安全的。您已標記 this nonatomic,這會禁用該行為。欲了解更多關于此,請參閱bbum的相當經典的答案上atomic。
不過,您的代碼也是一個很好的例子,說明僅依靠原子讀取來使代碼“執行緒安全”可能會出錯。這條線非常不安全:
if ((!model.testStr || ![model.testStr isKindOfClass:[NSString class]] || model.testStr.length == 0)) {
這使得三個單獨的讀取model.testStr。即使使用atomic,如果您可以在另一個執行緒上修改它,也不能保證它們是同一個物件。您測驗該類的事實表明它testStr可能不是 NSString。如果是這樣,那么model.testStr.length可能會因“不回應選擇器”而崩潰。如果您model.testStr在if塊內使用,那么這也可能與您測驗的值不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/406551.html
標籤:
