初始化只读属性

aws*_*ome 25 objective-c

我试图创建一个readonly属性.我想用类中的值初始化来创建这个类的实例,例如

@property (retain,readonly) NSString *firstName;

我试着像这样初始化它:

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

一旦我这样做,编译器报告了一个错误,即无法分配readonly属性.那我该怎么做呢?

Ole*_*ann 41

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

在你的.h文件中:

@property (readonly, copy) NSString *firstName;
Run Code Online (Sandbox Code Playgroud)

在.m文件中:

@interface MyClass ()

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

@end


@implementation MyClass

@synthesize firstName;
...
Run Code Online (Sandbox Code Playgroud)

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


Ren*_*ers 14

不要使用合成的setter:

firstName = [n retain]; //Or copy
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*est 5

您可以使用以下方法直接访问属性:

_firstName = n;

self.firstName = n隐含的setter方法将不会被合成,因为您readonly在中指定了@property (retain,readonly) NSString *firstName;,因此会导致编译器错误。