【发布时间】:2011-08-24 01:42:18
【问题描述】:
以下代码崩溃,因为sentence 的内容在最后一个块退出时消失了。
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// simple block test - just iterate over some items and
// add them to a string
NSArray *items = [NSArray arrayWithObjects:@"why ", @"must ", @"this ",nil];
__block NSString *sentence = @"";
[items enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
sentence = [sentence stringByAppendingFormat:@"%@",obj];
}];
// crash!
NSLog(@"Sentence is %@",sentence);
[pool drain];
return 0;
}
使这项工作的正确/惯用方式是什么?
【问题讨论】:
-
哇,这很奇怪,我不知道为什么这不起作用。
-
我见过人们在块的末尾做一个
[[someVariable retain] autorelease]来返回东西,但我不确定如果我怀疑自动释放池运行,为什么这会有什么不同。不过我不知道,这就是我问的原因,并且有各种各样的关于复制块和传递它们的文章,但我找不到像这样简单的东西。 -
你得到的错误/异常是什么?
-
Program received signal: “EXC_BAD_ACCESS”.它出错了,因为sentence一直是release'd。我在下面概述了我认为正在发生的事情,这实际上与块无关。
标签: objective-c objective-c-blocks