ARC在Xcode 4.2中的__weak和autorelease池

3

我的项目使用ARC。我用下面的代码进行了测试:

NSString __weak *string;
@autoreleasepool {
        string = [NSString stringWithString:@"AAA"];
}

NSLog(@"string: %@", string);
我认为它的输出结果是:
string: (null)

但实际输出为:

string: AAA

我不理解它。__weak 有什么作用?

编辑:

以及下面的代码:

NSString __weak *string;
NSString __strong *str;
@autoreleasepool {
    str = [NSString stringWithFormat:@"%@", @"AAA" ];
    string = str;
}

NSLog(@"string: %@", string);
它还可以输出为:
string: AAA
1个回答

8
NSString __weak *string;
@autoreleasepool {
        string = [NSString stringWithFormat:@"%@", @"AAA"];
}

NSLog(@"string: %@", string);

它会按照您想要的输出如下。
string: (null)

因此,
string = [NSString stringWithString:@"AAA"];

等同于

string = @"AAA";

不在堆中分配的常量字符串字面值。

已编辑:

str变量仍对自动释放对象有强引用。

以下代码正是您所需的。

NSString __weak *string;
{
    NSString __strong *str;
    @autoreleasepool {
        str = [NSString stringWithFormat:@"%@", @"AAA" ];
        string = str;
    }
}
NSLog(@"string: %@", string);

并且
NSString __weak *string;
@autoreleasepool {
    NSString __strong *str;
    str = [NSString stringWithFormat:@"%@", @"AAA" ];
    string = str;
}
NSLog(@"string: %@", string);

你的解释很完美。但是我在编辑中还有一个问题,请给我解释一下! - vietstone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接