初始化只读属性

时间:2010-04-29 11:12:27

标签: objective-c

我试图创建一个只读的属性。我想用类中的值初始化,创建一个这个类的实例,例如

@property (retain,readonly) NSString *firstName;

我试着像这样初始化它:

-(id)initWithName:(NSString *)n{ self.firstName = n; }

执行此操作后,编译器报告了无法分配readonly属性的错误。那我怎么能这样做呢?

3 个答案:

答案 0 :(得分:41)

直接分配给实例变量(如果需要,请不要忘记添加retaincopy)或在私有类扩展中重新声明属性。像这样:

在你的.h文件中:

@property (readonly, copy) NSString *firstName;

在您的.m文件中:

@interface MyClass ()

// Redeclare property as readwrite
@property (readwrite, copy) NSString *firstName;

@end


@implementation MyClass

@synthesize firstName;
...

现在,您可以在实现中使用合成的setter,但类接口仍将该属性显示为readonly。请注意,导入.h文件的其他类仍然可以调用-[MyClass setFirstName:],但是他们不会知道它存在并且会收到编译器警告。

答案 1 :(得分:14)

不要使用合成的二传手:

firstName = [n retain]; //Or copy

通常建议在任何init和dealloc方法中绕过setter。

答案 2 :(得分:4)

您可以使用以下方式直接访问该媒体资源:

_firstName = n;

由于您在self.firstName = n中指定了readonly,因此无法合成@property (retain,readonly) NSString *firstName;所暗示的setter方法,因此编译错误。