我收到错误
变量不可分配(缺少__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;
答案 0 :(得分:753)
答案 1 :(得分:38)
提醒我自己也犯了一个错误,
__block
首次声明变量时,必须完成声明,即块的OUTSIDE,而不是它的内部。这应解决有关变量的评论中提到的问题,而不是在块之外保留其值。
答案 2 :(得分:17)
只需使用__block
前缀来声明和分配块内的任何类型的变量。
例如:
__block Person *aPerson = nil;
__block NSString *name = nil;
答案 3 :(得分:10)
要在块内部分配一个变量,块之外的变量总是在该变量之前使用__block说明符,你的代码应该是这样的: -
__block Person *aPerson = nil;
答案 4 :(得分:10)
__block Person *aPerson = nil;
答案 5 :(得分:3)
如果您收到有关保留周期的任何警告,请尝试__weak
,否则请使用__block
Person *strongPerson = [Person new];
__weak Person *weakPerson = person;
现在,您可以在块中引用 weakPerson
对象。
答案 6 :(得分:3)
是块是最常用的功能,所以为了避免保留周期,我们应该避免使用强变量,包括块内的self,尽管使用_weak或weakself。
答案 7 :(得分:0)
当我看到相同的错误时,我试图像这样解决它:
__block CGFloat docHeight = 0.0;
[self evaluateJavaScript:@"document.height" completionHandler:^(id height, NSError *error) {
//height
NSLog(@"=========>document.height:@%@",height);
docHeight = [height floatValue];
}];
及其正常工作
只需在变量前添加“ __ block ”。