Может кто-нибудь объяснить этот синтаксис @synthesize? - PullRequest
2 голосов
/ 19 июля 2010

Я следую примеру шаблона Navigation View с основными данными в последнем iOS SDK.

В файле rootViewController.m я вижу это в строке @synthesize:

@synthesize fetchedResultsController=fetchedResultsController_, managedObjectContext=managedObjectContext_;

Где заголовочный файл:

@private
NSFetchedResultsController *fetchedResultsController_;
NSManagedObjectContext *managedObjectContext_;

}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;

Означает ли это, что они оба @synthesized (создают геттеры и сеттеры), но тогда один устанавливается равным другому? Также представляется, что fetchedResultsController также является методом в файле rootViewController.m.

Этот шаблон изменился в этой версии SDK, я слежу за книгой Apress More iPhone 3, и это действительно запутало вопросы.

Ответы [ 2 ]

3 голосов
/ 11 марта 2013

В синтаксисе @synthesize левая сторона = (это просто символ, который синтез использует для этого синтаксиса, а не оператор присваивания) - это имя свойства (и связанные методы) , а правая часть = - это переменная экземпляра, используемая для именованного свойства.

В приведенном выше примере @synthesize fetchedResultsController=fetchedResultsController_ создает fetchedResultsController метод получения и setFetchedResultsController: метод установки, оба используют переменную экземпляра fetchedResultsController_ для хранения.

Аналогично, @synthesize managedObjectContext=managedObjectContext_ создает managedObjectContext и setManagedObjectContext: методы доступа, оба поддерживаемые managedObjectContext_ переменной экземпляра.

Если бы «правые стороны» не были явно указаны (если объявление читается как @synthesize fetchedResultsController, managedObjectContext;) , синтезировать принял бы то же имя для переменной экземпляра, что и свойство.Некоторым программистам на Objective-C не нравится оставлять это при этом поведении по умолчанию, потому что можно легко совершить ошибку, намереваясь установить локальную переменную области действия и вместо этого установить переменную экземпляра.Использование подчеркивания для всех переменных экземпляра делает их намерение более понятным.

Для ясности, несколько @synthesize свойств могут быть объединены в одно путем разделения через запятую;каждый по-прежнему является собственным объявлением, так что вышеприведенное полностью эквивалентно:

@synthesize fetchedResultsController=fetchedResultsController_;
@synthesize managedObjectContext=managedObjectContext_;

Также ничего не стоит, в более новых версиях Xcode / iOS переменные экземпляра будут создаваться автоматически, если они не определены явно, а объявления @synthesizeтакже предполагается, если не указано иное.Эти различия объяснены в кратком справочнике Apple Objective-C о доступности функций .

0 голосов
/ 19 июля 2010

Только первый (по lhs оператора synthesize) синтезируется с помощью getter и setter и становится «публичной» переменной экземпляра.

Последний (с подчеркиванием) все еще доступен внутри экземпляра, но не доступен вне экземпляра.Они оба ссылаются на один и тот же адрес памяти.

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