处理 dispatch_sync 内的自动释放对象

dealing with autoreleased objects within dispatch_sync

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

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

但是我在想有没有更好的解决办法

由于您正在调用 release,您必须使用手动引用计数。在手动引用计数中,当您将某些内容存储到一个将超过范围的变量时,您必须保留它,然后如果您稍后将某些内容分配给该变量或该变量的生命周期将结束,您需要先释放该变量。

所以你可以这样做:

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