Использование @property и @synthesize с неявным созданием ivar - PullRequest
6 голосов
/ 02 августа 2011

Хорошо, поэтому в последнее время у меня появилась эта предположительная дурная привычка объявлять свойства моего класса с помощью @property, создавать геттеры и сеттеры с @synthesize и просто использовать их везде, где они мне нужны, как self.name без ссылки на внутренний ивар(пусть @synthesize сделает свою работу)

Теперь, конечно, это не позволяет мне получить доступ к внутреннему ивару (например, name_), но из того, что я кодировал до сих пор, я не сделал 'это действительно нужно.Для свойств, доступных только для чтения, я не использую @synthesize, но сам реализую метод получения.

Все выглядит хорошо, но почему-то у меня возникает ощущение, что это неправильно, потому что все библиотеки с открытым исходным кодомМы просмотрели, также объявили ivar и использовали его в коде.@property + @synthesize и нет ивара - это определенно ленивый выбор, но каковы недостатки?Может кто-нибудь дать мне какой-нибудь совет?

Кроме того, я читал, что в качестве общего совета можно использовать self.propertyName в любом месте кода вашего класса, кроме методов dealloc и init.Но до тех пор, пока вы убедитесь, что объект инициализируется:

-(id) init
{
    if( (self=[super init] )) {

    }
    return self;
}

и вы удалите все наблюдатели значения ключа перед вызовом [super dealloc] все должно быть в порядке.Верно?

Ответы [ 2 ]

5 голосов
/ 06 сентября 2011

Все зависит от того, для какой версии среды выполнения Objective-C вы создаете: Modern или Legacy .

  • Современная версия поддерживает "синтез переменных экземпляра для объявленных свойств". то есть. вам не нужно определять переменную экземпляра для каждого @property. Среда выполнения позаботится о ее создании. По умолчанию имя ивара будет таким же, как у @property. Вы можете изменить имя ивара, используя формат @synthesize propertyName = iVarName;

  • Версия Legacy не поддерживает синтез ивара, поэтому вы должны определить ивар для хранения @property.

Приложения iPhone и 64-разрядные программы в Mac OS X v10.5 и более поздних версиях используют современную версию среды выполнения. Вы должны предполагать, что любая другая платформа использует устаревшую версию.

Какие недостатки? Ну, самая большая из них - это переносимость - не определяя ivars, ваш код может работать на меньшем количестве платформ, например. это не будет работать на OSX 10.4. Вы также теряете некоторый контроль / гибкость и можете случайно столкнуться с конфликтами имен с подклассами и суперклассами.

Важно помнить, что вы должны освободить свойства, которые вы синтезировали с @synthesize. Свойства не освобождаются автоматически - вам следует release любое синтезированное свойство, которое не помечено assign (не освобождайте никакие свойства, помеченные как назначить).

N.B. Для дополнительного кредита вы можете привести в порядок свои свойства только для чтения. Нет особых причин писать свой собственный аксессор и не использовать @synthesize. Просто определите вашу собственность как доступную только для чтения и, по выбору, как вызвать геттер @property(getter=isIntReadOnlyGetter, readonly)

5 голосов
/ 02 августа 2011

ну @synthesize создаст внутренний ивар с тем же именем, что и у свойства:

@synthesize name;

- (void) dealloc {
   [name release], name  = nil;
   [super dealloc]
}

Или присвоит внутреннему ивару другое имя:

@synthesize name = _name;

- (void) dealloc {
   [_name release], _name  = nil;
   [super dealloc]
}

Я используюself.name в init, но не в dealloc и, кажется, прекрасно работает.

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