Одной из особенностей современной (64-разрядной OS X и iPhone OS) Objective C является способность свойств динамически синтезировать ivars без явного объявления их в классе:
@interface MyClass : NSObject {
// NSString *name; unnecessary on modern runtimes
}
@property (retain) NSStrng *name;
@end
@implementation MyClass
@synthesize name;
@end
В довольно небольшом моем коде я использую пользовательские реализации getter для инициализации свойств:
- (NSString *) name {
if (!name) {
name = @"Louis";
}
return name;
}
Вышеупомянутое несовместимо с синтезированными ivars, поскольку ему необходимо получить доступ к ivar, который не объявлен в заголовке. По разным причинам я хотел бы обновить ряд моих персональных фреймворков для использования синтезированных иваров, когда они построены на современных средах выполнения, вышеуказанный код необходимо модифицировать для работы с синтезированными иварами для достижения этой цели.
В то время как документация Objective C 2.0 гласит, что синтезированные аксессоры в современной среде выполнения будут синтезировать ivar при первом использовании. Он не указывает, какой механизм низкого уровня используется для этого. Это делается классом_getInstanceVariable(), являются ли ограничения на class_addIvar() ослабленными, является ли это недокументированной функцией int Object Object C 2.0 runtime? Хотя я мог бы реализовать свое собственное хранилище для данных, поддерживающих мои свойства, я бы скорее использовал механизм, который использует синтезированные аксессоры.