代码之家  ›  专栏  ›  技术社区  ›  vtruant

在dispatch\u sync中处理自动释放的对象

  •  0
  • vtruant  · 技术社区  · 6 年前

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

    __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 回复  |  直到 6 年前
        1
  •  2
  •   newacct    6 年前

    既然你打电话来 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];