Разница между методами присвоения свойства в Objective-C - PullRequest
3 голосов
/ 30 декабря 2011

Вот 2 способа присвоить свойство в Objective-C:

МЕТОД 1

// in header
@interface Book : NSObject {
    NSString *_title;
}

@property (nonatomic, retain) NSString *title;

// in implementation
@implementation Book
@synthesize title = _title;

МЕТОД 2

// in header
@interface Book : NSObject {
    NSString *title;
}

@property (nonatomic, retain) NSString *title;

// in implementation
@implementation Book
@synthesize title;

В чем разница? В последнее время я использую метод 1, так как другие учебники рекомендуют метод 1, но никто не объясняет почему.

Ответы [ 2 ]

6 голосов
/ 30 декабря 2011

Разница в именах.В # 2 свойство и поле экземпляра имеют одинаковые имена.В # 1 они имеют разные имена.

Преимущество # 1 в том, что трудно случайно ссылаться на свойство, когда вы имеете в виду поле экземпляра или наоборот.Ссылка на неправильный может привести к тому, что объект будет сохранен дважды или не сохранен вообще.

Преимущество # 2 состоит в том, что он несколько проще и работает нормально, если вы осторожны и немного формальны в своемиспользование вещей.

[И, я вижу, один аромат определяет assign, а другой retain, что совершенно другая лекция.Обычно вы не используете assign с указателем объекта.]

0 голосов
/ 30 декабря 2011

Во-первых, я рекомендую использовать copy вместо retainassign) для типа 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 более понятно, а?).:)

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