Во-первых, я рекомендую использовать copy
вместо retain
(и assign
) для типа NSString
экземпляра.Если он изменчив, он копируется;Если нет, то он просто сохраняется.
Может быть, вам понравится ЭТО ОБСУЖДЕНИЕ .
И для вас вопрос, разница в том, чтопервый использует то же имя, а второй использует другое имя для iVar
& property
.
На самом деле, вы можете использовать МЕТОД 3:
// in header
@interface Book : NSObject {
}
@property (nonatomic, copy) NSString *title;
// in implementation
@implementation Book
@synthesize title;
Для @Синтезировать для работы в устаревшей среде выполнения вы должны либо предоставить переменную экземпляра с тем же именем и совместимым типом свойства, либо указать другую существующую переменную экземпляра в операторе @synthesize.В современной среде выполнения, если вы не предоставите переменную экземпляра, компилятор добавит ее для вас.Например, учитывая следующее объявление и реализацию класса.
Вот пример кода официального документа, вы можете прояснить его (он включает разницу между вашим METHOD 1 & МЕТОД 2 ):
@interface MyClass : NSObject {
float sameName;
float otherName;
}
@property float sameName;
@property float differentName;
@property float noDeclaredIvar;
@end
@implementation MyClass
@synthesize sameName;
@synthesize differentName=otherName;
@synthesize noDeclaredIvar;
@end
Компилятор для устаревшей среды выполнения сгенерирует ошибку на @synthesize noDeclaredIvar;
, тогда как компилятор для современной среды выполнения добавит переменную экземпляра для представления noDeclaredIvar
.
Примечание : приложения для iPhone и 64-разрядные программы в Mac OS X v10.5 и более поздних версиях используют современную версию среды выполнения.Другие программы (32-разрядные программы на рабочем столе Mac OS X) используют устаревшую версию среды выполнения.Вы можете сослаться на это ЗДЕСЬ ).
Однако я предлагаю использовать МЕТОД 1 или МЕТОД 3 .Поскольку вы можете просто использовать self.title
в коде, свойство поможет вам управлять alloc
& release
.Если вы используете METHOD 2 , вы можете смешать title
с self.title
(но _title
более понятно, а?).:)