[英]ARC and Block syntax EXC_BAD_ACCESS
如果此屬性為“ strong”,則沒有問題。 但是,如果此屬性為“弱”,那么我會收到錯誤EXC_BAD_ACCESS。
@property (weak, nonatomic) void(^pickerCompletion)(NSDate *date);
-(void)textFieldDidEndEditing:(UITextField *)textField {
if (self.pickerCompletion) self.pickerCompletion(self.date);
}
我正在使用if語句檢查屬性是否為nil,那么這里的問題是什么?
如果ARC清除了該指針,那么我希望if語句的結果為false而不執行該塊。
@property (strong, nonatomic) void(^pickerCompletion)(NSDate *date);
如果該屬性strong
,則編譯器會自動復制該塊。 pickerCompletion
具有復制的塊(堆塊)的所有權。
@property (weak, nonatomic) void(^pickerCompletion)(NSDate *date);
但是,如果該屬性為weak
,則編譯器不執行任何操作,只需將指針值放在變量中即可。 而且,如果指針是堆棧塊(僅是普通塊文字),則ARC永遠不會將指針值填充為零。 那樣的編譯器沒有收到警告消息嗎?
warning: assigning block literal to a weak property; object will be
released after assignment
此外還有比賽條件。
if (self.pickerCompletion) self.pickerCompletion(self.date);
self.pickerCompletion
可能是零填充之前self.pickerCompletion(self.date)
后if (self.pickerCompletion)
在多線程環境。 使用臨時__strong
變量安全地訪問弱對象。
void(^pickerCompletion)(NSDate *date) = self.pickerCompletion;
if (pickerCompletion) pickerCompletion(self.date);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.