【问题标题】:Assignment to readonly property error iOS 6赋值给只读属性错误iOS 6
【发布时间】:2013-01-17 22:12:12
【问题描述】:

我有一个名为 Constants 的 Singleton 类,我需要在其中设置一些应用范围的常量。我希望这些常量是只读的。所以我在 Constants.h 文件中做了以下操作

 @interface Constants : NSObject
 {

 }

 @property (nonatomic, readonly)double U_LAT;
 @property (nonatomic, readonly)double U_LNG;

然后在我的 .m 文件中我得到了这个方法

 -(id)init
 {
     self = [super init];

     self.U_LAT = 49.2765;
     self.U_LNG = -123.2177;

     return self;
 }

我从这段代码中得到这个错误:

 Assignment to readonly property

我不能在 init 方法中初始化我的只读变量吗?如果不是,我该如何初始化它们?

【问题讨论】:

    标签: ios objective-c properties ios6 attributes


    【解决方案1】:

    self.propertyName = val;[self setPropertyName:val]; 相同——它需要一个setter 方法存在。只读属性没有 setter 方法。

    您可以直接设置支持该属性的 ivar,但是:

    -(id)init
     {
         self = [super init];
    
         _U_LAT = 49.2765;
         _U_LNG = -123.2177;
    
         return self;
     }
    

    如果您允许自动合成属性,则 ivar 的名称将是带有下划线前缀的属性名称。如果您有明确的@synthesize propName;,则 ivar 将具有相同的名称。您还可以使用您喜欢的任何名称创建变量,同样使用综合语句:@synthesize cat = dog;

    该属性也可以是公开只读的,但可以被类写入;这涉及在类扩展中声明一个 setter 方法或 redeclaring the property in the extension

    【讨论】:

      【解决方案2】:

      我认为更好的方法是在私有接口中重新声明属性,如下所示:

      // .h
      
      @interface Constants : NSObject
      @property(nonatomic, readonly) double U_LAT;
      @end
      
      // .m
      
      @interface Constants ()
      @property(nonatomic, readwrite) double U_LAT;
      @end
      

      是的,在 inits 和 dealloc 中,直接将变量称为 _U_LAT。

      【讨论】:

      • 或者最好将它们称为self.U_LAT
      • Zaph:强烈建议不要在初始化期间使用访问器方法 (self.foo)。最好使用下划线变量_foo
      【解决方案3】:

      最好不要将它们声明为属性,而是声明为常量。

      .h文件中,在@interface上方添加如下代码:

      extern double const U_LAT;
      extern double const U_LNG;
      

      然后在.m文件中,在@interface上方添加如下代码:

      double const U_LAT = 49.2765;
      double const U_LNG = -123.2177;
      

      U_LATU_LNG 将可用于导入 Constants.h 的任何类,您不必处理属性或接口。

      const 正是为了这种事情而发明的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 2017-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多