在Xcode 4.2中的ARC中__weak和autorelease池

vie*_*one 3 autorelease weak xcode4.2 automatic-ref-counting

我的项目使用ARC.我测试了下面的代码:

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

NSLog(@"string: %@", string);
Run Code Online (Sandbox Code Playgroud)

我认为它输出为:

string: (null)
Run Code Online (Sandbox Code Playgroud)

但实际输出:

string: AAA
Run Code Online (Sandbox Code Playgroud)

我不明白.__weak有什么影响?

编辑:

这段代码如下:

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

NSLog(@"string: %@", string);
Run Code Online (Sandbox Code Playgroud)

它还输出为:

string: AAA
Run Code Online (Sandbox Code Playgroud)

Kaz*_*oto 8

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

NSLog(@"string: %@", string);
Run Code Online (Sandbox Code Playgroud)

它输出如下你想要的.

string: (null)
Run Code Online (Sandbox Code Playgroud)

从而,

string = [NSString stringWithString:@"AAA"];
Run Code Online (Sandbox Code Playgroud)

和...一样

string = @"AAA";
Run Code Online (Sandbox Code Playgroud)

未在堆中分配的常量字符串文字.

编辑:

str变量仍然是自动释放对象的强引用.

以下代码正是您想要的.

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

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