В вашем общедоступном интерфейсе объявите свойство только для чтения, т.е.
// Foo.h
@interface Foo
{
@private
Baz* bar;
}
@property (readonly, retain) Baz* bar;
@end
В вашей реализации вы можете объявить расширение класса , затем вы повторно объявите свойство read / write:
// Foo.m
@interface Foo() // Note parentheses
@property (retain) Baz* bar;
@end
@implementation Foo
@synthesize bar;
@end
Вышеуказанное означает, что будут созданы и установщик, и получатель, но в файлах, которые содержат заголовок, будет известен только получатель.Недостатком является то, что установщик действительно существует, так что если вы игнорируете предупреждения компилятора и используете установщик вне Foo.m, он все равно будет работать.
Однако преимущество перед простым объявлением свойства только для чтения и доступомнапрямую ивар заключается в том, что вам не нужно внедрять KVO вручную, и, конечно же, управление памятью выполняется автоматически.