代码之家  ›  专栏  ›  技术社区  ›  awsome

初始化只读属性

  •  25
  • awsome  · 技术社区  · 16 年前

    @property (retain,readonly) NSString *firstName;

    我试着这样初始化它:

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

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

    3 回复  |  直到 16 年前
        1
  •  44
  •   Ole Begemann    16 年前

    或者直接赋值给实例变量(不要忘记添加 retain copy

    @property (readonly, copy) NSString *firstName;
    

    在.m文件中:

    @interface MyClass ()
    
    // Redeclare property as readwrite
    @property (readwrite, copy) NSString *firstName;
    
    @end
    
    
    @implementation MyClass
    
    @synthesize firstName;
    ...
    

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

        2
  •  14
  •   Rengers    16 年前

    不要使用合成设置器:

    firstName = [n retain]; //Or copy
    

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

        3
  •  5
  •   danVnest    11 年前

    您可以通过以下方式直接访问该属性:

    _firstName = n;

    setter方法 self.firstName = n 因为您指定了 readonly 在里面 @property (retain,readonly) NSString *firstName; ,因此出现编译器错误。