我收到了一个错误
变量不可分配(缺少__block类型说明符)
在线aPerson = participant;
。如何确保块可以访问aPerson
变量并返回aPerson
变量?
Person *aPerson = nil;
[participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
Person *participant = (Person*)obj;
if ([participant.gender isEqualToString:@"M"]) {
aPerson = participant;
*stop = YES;
}
}];
return aPerson;
只是提醒我自己也犯了一个错误
__block
声明必须在首次声明变量时完成,即块的OUTSIDE,而不是它的内部。这应该解决关于变量不在块之外保留其值的注释中提到的问题。
只需使用__block
前缀来声明并在块内分配任何类型的变量。
例如:
__block Person *aPerson = nil;
__block NSString *name = nil;
要在块外部分配一个变量,在块之外总是使用__block说明符,那么代码应该是这样的: -
__block Person *aPerson = nil;
__block Person *aPerson = nil;
如果你得到关于保留周期的任何警告,请尝试__weak
,否则使用__block
Person *strongPerson = [Person new];
__weak Person *weakPerson = person;
现在您可以在块内引用weakPerson
对象。
yes block是最常用的功能,所以为了避免保留周期,我们应该避免使用强变量,包括块内的self,尽管使用_weak或weakself。