ARC和Block语法EXC_BAD_ACCESS

时间:2015-08-14 15:41:34

标签: ios objective-c automatic-ref-counting

如果此属性为“强”,则没有问题。但是,如果此属性为“弱”,则会收到错误EXC_BAD_ACCESS。

print $0, $1 in c ? c[$1] : ";"

我使用if语句来检查属性是否为零,那么这里的问题是什么?

如果ARC清除此指针,那么我希望if语句计算为false而不执行该块。

1 个答案:

答案 0 :(得分:0)

@property (strong, nonatomic) void(^pickerCompletion)(NSDate *date);    

如果属性为strong,则编译器会自动复制该块。 pickerCompletion拥有复制块(堆块)的所有权。

@property (weak, nonatomic) void(^pickerCompletion)(NSDate *date);    

但是如果属性为weak,则编译器不执行任何操作,只需将指针值放入变量即可。如果指针是Stack Block(只是普通的块文字),则指针值永远不会被ARC填充。你没有收到编译器的警告信息吗?

warning: assigning block literal to a weak property; object will be
  released after assignment

此外还有竞争条件。

if (self.pickerCompletion) self.pickerCompletion(self.date);
在多线程环境中self.pickerCompletion之后,{p> self.pickerCompletion(self.date)可以在if (self.pickerCompletion)之前填零。使用临时__strong变量安全地访问弱对象。

void(^pickerCompletion)(NSDate *date) = self.pickerCompletion;
if (pickerCompletion) pickerCompletion(self.date);