我试图创建一个只读的属性。我想用类中的值初始化,创建一个这个类的实例,例如
@property (retain,readonly) NSString *firstName;
我试着像这样初始化它:
-(id)initWithName:(NSString *)n{
self.firstName = n;
}
执行此操作后,编译器报告了无法分配readonly属性的错误。那我怎么能这样做呢?
答案 0 :(得分:41)
直接分配给实例变量(如果需要,请不要忘记添加retain
或copy
)或在私有类扩展中重新声明属性。像这样:
在你的.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方法,因此编译错误。