__слабый пул автозапуска в ARC в Xcode 4.2 - PullRequest
3 голосов
/ 29 ноября 2011

Мой проект использует ARC. Я тестировал с кодом ниже:

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

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

Я думаю, что вывод:

string: (null)

но на самом деле вывод:

string: AAA

Я не понимаю этого. Каково влияние __weak?

EDIT:

И этот код ниже:

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

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

Также выводится как:

string: AAA

1 Ответ

8 голосов
/ 29 ноября 2011
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);
...