处理dispatch_sync中的自动释放对象

时间:2018-11-05 14:00:35

标签: objective-c-blocks autorelease unsafe-unretained

在这种情况下避免访问不当的最佳解决方案是什么?

__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];

但是我想知道是否还有更好的解决方案

1 个答案:

答案 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];