在这种情况下避免访问不当的最佳解决方案是什么?
__block NSString* string;
dispatch_sync(dispatch_get_main_queue(), ^{
string = [NSString stringWithString:@"I'm autoreleased!"];
});
NSLog(@"My string is: %@", string);
我将代码更改为此:
NSMutableString *string = [[NSMutableString alloc] init];
dispatch_sync(dispatch_get_main_queue(), ^{
[string appendString:@"I'm autoreleased!"];
});
NSLog(@"My string is: %@", string);
[string release];
但是我想知道是否还有更好的解决方案
答案 0 :(得分:2)
由于您正在呼叫release
,因此必须使用手动引用计数。在手动引用计数中,当您将某些内容存储到一个超出范围的变量中时,必须保留它,然后如果以后再为该变量分配某些内容,否则该变量的生命周期将结束,则需要首先释放该变量。 / p>
因此您可以这样做:
__block NSString* string;
dispatch_sync(dispatch_get_main_queue(), ^{
string = [[NSString stringWithString:@"I'm autoreleased!"] retain];
// or equivalently:
// string = [[NSString alloc] initWithString:@"I'm autoreleased!"];
});
NSLog(@"My string is: %@", string);
[string release];