Может кто-нибудь объяснить этот синтаксис @synthesize?

Я следую примеру шаблона представления навигации с основными данными в последнем пакете SDK для iOS.

В файле 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 book More iPhone 3, и это действительно запутало ситуацию.


person JMWhittaker    schedule 18.07.2010    source источник


Ответы (2)


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

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

person TomH    schedule 18.07.2010
comment
Хорошо, это имеет смысл, я также понимаю, что публичный экземпляр также вызывает метод с тем же именем при загрузке? Выглядит очень странно, особенно для примера приложения из документации Apple! Я понятия не имею, что вызывает метод fetchedResultsController. - person JMWhittaker; 19.07.2010

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

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

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

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

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

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

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

person Slipp D. Thompson    schedule 11.03.2013