Декларация о свойствах и автоматическое резервирование хранилища

Я пытаюсь понять свойства Objective-C, и у меня есть некоторые затяжные вопросы об их синтаксисе.

В чем разница между явным объявлением ivar для такого свойства:

@interface myObject1 : NSObject {
  NSString *title;
}
@property (copy) NSString *title;
@end

и это:

@interface myObject2 : NSObject {
}
@property (copy) NSString *title;
@end

Кажется, что работает пример myObject2. Можно ли реализовать свойства, как в myObject2, или должен быть явно определен связанный ivar?

Каковы последствия неявного объявления ivar?

Ответ 1

В современной среде выполнения Objective C (nonfragile-abi) они одинаковы, поддержка ivar будет автоматически создаваться в объявлении @synthesize. Это среда выполнения, используемая iPhone, и 64-битные приложения Mac OS X. 32-разрядная версия Mac OS X использует устаревшую среду исполнения, где невозможно синтезировать ivar, а второй бит написанного вами кода не будет правильно компилироваться.

В последних версиях симулятора iPhone используется современная среда исполнения, но у старых нет. Поэтому, хотя оба примера кода будут работать на фактически iPhone (синтезируя необходимое хранилище), второй пример не будет скомпилирован для симулятора, если у вас нет обновленного Xcode.

Ответ 2

В современной среде исполнения они одинаковы (как уже упоминалось), за исключением того факта, что ivars, которые явно не определены как в MyObject1, не будут отображаться в отладчике при просмотре переменных или наведении указателя мыши на переменные, вы должны распечатать значения переменных или задать сводку переменной в представлении переменных для отображения свойств.

Я начал использовать способ MyObject2 делать что-то из-за ввода меньше, но более раздражает необходимость вводить командную строку gdb для просмотра состояния переменной в отладчике: (