尝试从其修改块的外部访问__block
(块可变)变量时,遇到一个奇怪的问题。这是我使用只是为了更好地了解一般块的非常玩具的例子,但现在我有这个方法的控制器创建与使用NSDictionary
的enumerateKeysAndObjectsUsingBlock:
Obj-C __block变量保留行为
NSDictionary
的内容的字符串
- (NSString*) contentsOfDictionary:(NSDictionary*)dictionary
{
__block NSString *content = @"";
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
NSString* contentToAppend = [NSString stringWithFormat:@"Object:%@ for key:%@\n", obj, key];
content = [content stringByAppendingString:contentToAppend];
NSLog(@"Content in block:\n%@", content);
}];
NSLog(@"Content out of block:\n%@", content);
return content;
}
当运行该方法用含有内容的字典:
Value Key
"Queen" "card"
"Hearts" "suit"
"10" "value"
的content
变量块内的正确修饰和我得到如下的输出随着每次迭代:
...内容块:
Object:Queen for key:card
...内容块:
Object:Queen for key:card
Object:Hearts for key:suit
...块内容:
Object:Queen for key:card
Object:Hearts for key:suit
Object:10 for key:value
只要代码步骤尽管如此,访问content
字符串会抛出一个EXC_BAD_ACCESS
,并且在一次运行的情况下它似乎已经打印了一些垃圾内存(无法重现)...
什么导致这个变量被提前释放?我的印象是,给它一个__block
定义意味着它在块中使用时被保留,并在块退出时被释放 - 但是该变量被保留和自动释放以便作为字符串文字开始,所以我期望在这种方法最早退出之前不会被处理。
没错。 – donalbain 2011-06-15 21:29:00