Добавление переменных-членов в цель C - PullRequest
3 голосов
/ 04 мая 2011

Сначала я должен сделать

@property (retain) aMember;

Затем в файле реализации я должен сделать

@synthesize aMember;

Тогда в Deloc, я должен сделать

self.aMember= nil; (or [aMember release])

Это 3 раза пишет, что по сути то же самое

Есть ли способ ускорить это?

Я имею в виду, что я могу перетащить элемент управления из IB, и xcode автоматически сгенерирует эти коды, почему я не могу сделать это для более обычных кодов?

Ответы [ 4 ]

3 голосов
/ 04 мая 2011

Будучи человеком из C # и руководящим языками для моей повседневной работы, я полностью согласен с вами в вопросе об этом трехэтапном процессе. На самом деле почти безумно легко создавать свойства в C # в MS Visual Studio, но я отвлекся.

Несмотря на то, что вы должны написать эти 3 строки, под вашими обложками идет огромная работа.

  1. Ваша декларация @property сообщает target-c некоторые важные атрибуты (атомарные, неатомарные, сохраняемые, копируемые и т. Д.) В том, как обращаться с вашим свойством, когда оно установлено пользователями вашего класса. Когда вы думаете об этом, эти атрибуты (без написания кода) таковы; помогая вам создавать потокобезопасный код, обрабатывая ссылки на объекты, чтобы вам не приходилось беспокоиться о их исчезновении, или копируя значения, чтобы у вас была собственная копия объекта. @Property также важен, так как он объявлен в вашем заголовочном файле (обычно). Это дает другим разработчикам представление о свойствах вашего класса и некоторые небольшие подсказки о том, как объекты, которые они передают в эти свойства, будут обрабатываться в течение его жизни.

  2. @synthesize также проделывает немалую работу, создавая методы получения и установки для этого свойства, которые также обрабатывают все виды управления памятью для вас. Вам не нужно беспокоиться об освобождении старых ссылок и правильной ссылке на новый объект. Это одно для меня - отличная функция, особенно когда вы новичок в объективе-c, и легко забыть иметь дело с управлением памятью на каждом шагу. @Synthesize просто делает это для вас, и вам не нужно писать весь код get и set самостоятельно.

  3. Вызов dealloc - это просто жизнь в неуправляемой среде. Хотя это добавляет дополнительные шаги, я ценю преимущества, которые явное управление памятью дает в ограниченной среде, такой как телефон.

Так что все 3 шага обязательны, они разные, и когда вы думаете об этом, на самом деле довольно много работы для вас под одеялом.

2 голосов
/ 04 мая 2011

К сожалению, так оно и есть (пока). Apple недавно попробовала позволить Clang неявно синтезировать ваши свойства, что уменьшило бы вашу работу до:

@interface Blah : NSObject
@property (retain) Blorg *blorg;
@end

@implementation Blah

- (void)dealloc {
  [blorg release];
  [super dealloc];
}

@end

Если вы не хотите, чтобы переменная экземпляра была синтезирована, вы просто явно указали @dynamic blorg в своей реализации. Но эта функция была удалена из-за некоторых непредвиденных осложнений, несмотря на в основном положительные отзывы разработчиков.

Итак, я думаю, можно с уверенностью ожидать, что Apple все еще работает над этим. Но сейчас вам нужно явно синтезировать.

Несколько других заметок:

  1. Если вы используете сборщик мусора, вам не нужно реализовывать -dealloc: просто убедитесь, что в последнюю минуту производится очистка в -finalize (например, отмена уведомления).

  2. Вы также можете избежать бита -dealloc, поместив переменную вашего экземпляра в класс C ++, который выполняет управление памятью во время построения и уничтожения: @property prop_wrapper<Blorg> blorg; будет работать. Затем, когда ваш объект будет уничтожен, на ваш объект будет вызван ~prop_wrapper(). Я сделал это, и это работает, но я рекомендую против этого, так как это не очень хорошо работает с KVO и KVC.

  3. Вы можете перебирать свойства объекта и освобождать те, которые отмечены copy или retain. Тогда в -dealloc вы получите что-то вроде [self releaseProperties]. Я также сделал это, но я также рекомендую против этого, так как это может вызвать незначительные проблемы, которые могут привести к необъяснимым сбоям, если вы не будете осторожны.

1 голос
/ 04 мая 2011

Это в 3 раза больше того, что по сути одинаково

Нет, не так.

@property (retain) aMember;

В приведенной выше строке объявляется свойство, чтобы компилятор знал,можно отправлять сообщения -aMember и -setAMember: объектам вашего класса.Он также сообщает компилятору (и разработчикам), что свойство является свойством retain (т. Е. Объект, для которого вы устанавливаете свойство, будет сохранено), что оно доступно для чтения / записи и является атомарным.

@synthesize aMember;

Приведенная выше строка сообщает компилятору, что он должен автоматически генерировать методы setter и getter для объявленного свойства.Вы можете пропустить это, но тогда вам нужно написать свой собственный установщик и получатель.

[aMember release]; // in dealloc

Есть ли, чтобы сообщить среде выполнения, что когда объект освобождается, ему больше не нужно хранить ссылку на него?переменная экземпляра.Это необходимо, потому что, когда вы используете подсчет ссылок, а не сборщик мусора, среда выполнения автоматически не очищает нежелательные объекты.

Каждая из этих строк выполняет свою функцию.Таким образом, вы не делаете то же самое три раза.

1 голос
/ 04 мая 2011

Чтобы на самом деле добавить переменную-член в target-c, вам не нужно ничего делать.

То, что вы делаете в эти 3 шага:

  1. Объявление свойств для переменной-члена.(В вашем случае вы указываете, что хотите, чтобы установщик свойств «сохранил» объект, для которого он устанавливает переменную-член)

  2. Объявите методы получения и установки свойств по умолчанию дляваша собственность.

  3. Освободите объект, который хранит ваша собственность.

ЕСЛИ вы только хотели объявить переменную-член, все, что вам нужно былосделать было объявить это в вашем классе:

@interface SomeClassObject : NSObject {
   int someMemberVariable;
}
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...