如果此属性为“强”,则没有问题。但是,如果此属性为“弱”,则会收到错误EXC_BAD_ACCESS。
print $0, $1 in c ? c[$1] : ";"
我使用if语句来检查属性是否为零,那么这里的问题是什么?
如果ARC清除此指针,那么我希望if语句计算为false而不执行该块。
答案 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);