在Xcode 4.2中的ARC中__weak和autorelease池

时间:2011-11-29 06:51:09

标签: xcode4.2 automatic-ref-counting autorelease weak

我的项目使用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 个答案:

答案 0 :(得分: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);