【问题标题】:dealing with autoreleased objects within dispatch_sync在 dispatch_sync 中处理自动释放的对象
【发布时间】:2018-11-05 14:00:34
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    由于您正在调用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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      相关资源
      最近更新 更多