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
4

1 回答 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);
于 2011-11-29T07:22:06.330 回答