【发布时间】:2011-06-15 19:11:08
【问题描述】:
我在尝试从修改它的块外部访问 __block(块可变)变量时遇到了一个奇怪的问题。这是一个非常简单的示例,我使用它只是为了更好地理解块,但目前我有一个使用这种方法的控制器,它创建一个包含NSDictionary 内容的字符串,它使用NSDictionary's enumerateKeysAndObjectsUsingBlock:
- (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 定义意味着它在块中使用时被保留,并在块退出时释放 - 但是变量被保留并自动释放以开始,因为它是一个字符串文字所以我希望在此方法最早退出之前不会释放它。
【问题讨论】:
标签: objective-c memory-management objective-c-blocks