0

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

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

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

4

1 回答 1

2

由于您正在调用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];
于 2018-12-31T03:42:10.903 回答