Свойства в Objective-C 2.0 - это не объекты, а методы.
Вернувшись в Objective-C 1.0, вы должны были создать свои собственные средства доступа, например:
@interface RootViewController : UITableViewController {
NSManagedObjectContext *__managedObjectContext;
}
@end
@implementation RootViewController
-(NSManagedObjectContext *) managedObjectContext{
if (__managedObjectContext!=nil) {
return __managedObjectContext;
}
//... else initialize the context
[__managedObjectContext retain];
return __managedObjectContext;
}
-(void) setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext{
if (__managedObjectContext!=nil) {
[__managedObjectContext release];
__managedObjectContext=nil;
}
__managedObjectContext=managedObjectContext;
[__managedObjectContext retain];
}
Вы бы использовали это так:
NSManagedObjectContext *moc=[self managedObjectContext];
или
[self setManagedObjectContext:anotherContext];
Поскольку вы всегда вызывали методы доступа, вы могли быть уверены, что объект переменной экземпляра всегда будет правильно сохраняться в освобожденном.
В Objective-C 2.0 объединенные директивы @property и @synthesize автоматизируют все это свойство.
Объявление свойства сообщает прекомпилятору, какие методы создавать по имени, readwrite, атомарности, сохранению и т. Д. Директива synthes сообщает прекомпилятору, какие методы свойств нужно генерировать автоматически, если они не существуют. По умолчанию он также создает переменную экземпляра с тем же именем, что и у свойства. Если вы добавите = someOtherSymbol
, он создаст переменную экземпляра с другим именем, чтобы вы случайно не обратились к нему.
Нотация собственной точки автоматически вызывает метод средства доступа вместо прямого доступа к переменной экземпляра. Это важно, потому что если вы сделаете это:
__managedObjectContext= aContext;
... недавно переданный объект aContext
не сохраняется и не освобождается и может либо неожиданно исчезнуть, либо утечь память. Это связано с тем, что прямая ссылка не вызывает метод доступа, тогда как:
self.manageObjectContext= aContext;
или
[self setManagedObjectContext: aContext];
и методы доступа к вызову, и автоматическая обработка удержания.