ARC: Как освободить статическую переменную? - PullRequest
10 голосов
/ 30 октября 2011

Будет dealloc (ниже) освобождать NSString, на который указывает статическая переменная exampleString?

// ExampleClass.h

@interface ExampleClass : NSObject

@end

// ExampleClass.m

static NSString *exampleString;

@implementation ExampleClass

- (void)dealloc {
    exampleString = nil;
}

- (id)init {
    self = [super init];
    if (self) {
        exampleString = [NSString stringWithFormat:@"example %@", @"format"];
    }
    return self;
}

@end

1 Ответ

20 голосов
/ 30 октября 2011

Да, поскольку, поскольку вы не указали квалификатор владения, компилятор LLVM делает вывод, что exampleString имеет __strong квалификацию владения.

Это означает, что, установив exampleString в nil в dealloc, вы сохраняете nil (новое значение), которое ничего не делает, и освобождаете старое значение.

Источник

Согласно разделу 4.4.3. Аргументы шаблона из документации LLVM по автоматическому подсчету ссылок (ARC) Objective-C , "Если аргумент шаблона для параметра типа шаблона является типом сохраняемого владельца объекта, который не имеет явного квалификатора владения" , он настроен на __strong квалификацию. "

И, согласно п. 4.2. Семантика , "Для объектов __strong сначала сохраняется новый pointee; во-вторых, lvalue загружается примитивной семантикой; в-третьих, новый pointee сохраняется в lvalue с примитивной семантикой; и, наконец, старый pointee является выпущено. Это не выполняется атомарно; для обеспечения безопасности при одновременной загрузке и хранении должна использоваться внешняя синхронизация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...