将Block内的变量赋值给Block外的变量

我得到一个错误

变量不可赋值(缺少__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;
158101 次浏览

你需要使用这行代码来解决你的问题:

__block Person *aPerson = nil;

有关更多详细信息,请参考本教程:块和变量

要在块内分配一个变量,而在块外总是在该变量之前使用__block说明符,你的代码应该像这样

__block Person *aPerson = nil;

只需使用__block前缀来声明和分配块内的任何类型的变量。

例如:

__block Person *aPerson = nil;


__block NSString *name = nil;

只是提醒我自己也犯了个错误

 __block

声明必须在第一次声明变量时完成,也就是说,在块的外部,而不是在块的内部。这将解决注释中提到的关于变量在块外不保留其值的问题。

__block Person *aPerson = nil;

如果你得到任何关于保留周期的警告,请尝试__weak,否则使用__block

Person *strongPerson = [Person new];
__weak Person *weakPerson = person;

现在你可以在块内引用weakPerson对象。

block是最常用的函数,所以为了避免retain循环,我们应该避免在block中使用strong变量,包括self,尽管使用_weak或weakself。

当我看到同样的错误时,我试图像这样解决它:

   __block CGFloat docHeight = 0.0;




[self evaluateJavaScript:@"document.height" completionHandler:^(id height, NSError *error) {
//height
NSLog(@"=========>document.height:@%@",height);
docHeight = [height floatValue];
}];

它运行正常

只要在变量前面加上“__block”。