Понимание атрибута @property по сравнению с автоматически сгенерированным кодом Xcode 4 - PullRequest
1 голос
/ 18 февраля 2012

У меня есть несколько сомнений относительно использования атрибутов.Прочитав документ перехода ARC, вместо сохранения и назначения следует использовать сильные и слабые.

Однако есть как минимум два случая, когда автоматически сгенерированный код XCode делает что-то еще.Я хотел бы знать, является ли это просто «все еще не обновленным» инструментом из XCode, или я что-то упускаю.

Первый случай - это автоматическая генерация управляемого объекта Core Data.

После создания соответствующих классов в файле .h появляется следующее:

@property(nonatomic,retain) NSString *myProperty;

Что делает компилятор в этом случае?Замените retain на strong?

Но самый странный случай (из-за моего отсутствия знаний) - это IBOutlet, автоматически сгенерированный код при подключении к розетке Interface Builder с файлом .h выглядит так:

@property (unsafe_unretained, nonatomic) IBOutlet UILabel *myOutlet;

и, опять же, это кажется отличным от рекомендуемых «слабых» атрибутов.Я имею в виду рекомендации пользователей на разных форумах.

И это добавлено в viewDidUnload:

- (void)viewDidUnload {
    [self setMyOutlet:nil];
}

зачем нам это утверждение?Даже если при работе с инструментами профилирования нет следов утечки памяти или других проблем с памятью?Я имею в виду, без установки на nil все работает нормально.

1 Ответ

1 голос
/ 18 февраля 2012

unsafe_unretained будет хранить указатель небезопасный , т. Е. Указатель все еще будет там, когда ваша метка исчезнет, ​​но он будет указывать на некоторый мусор. Вот почему код -viewDidUnload сбрасывает этот указатель на nil в этой точке. Использование weak свойств автоматически превратит значение указателя в nil, когда объект, на который он указывает, исчезнет. Вот почему это рекомендуется.

retain и strong - это одно и то же. Объект сохраняется, то есть не исчезнет, ​​пока для свойства не будет установлено другое значение (например, nil), и в этот момент объект будет освобожден.

...