簡體   English   中英

ARC和塊語法EXC_BAD_ACCESS

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM