0

我有一个名为 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 方法中初始化我的只读变量吗?如果不是,我该如何初始化它们?

4

3 回答 3

10

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 语句:@synthesize cat = dog;

该属性也可以是公开只读的,但可以由类写入;这涉及在类扩展中声明 setter 方法或在扩展中重新声明属性

于 2013-02-02T20:09:38.970 回答
5

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

// .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。

于 2013-02-02T20:13:51.657 回答
0

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

.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_LAT和将U_LNG可用于任何导入的类,Constants.h您不必处理属性或接口。

正是为了这种东西const被发明出来的。

于 2013-02-03T06:46:02.730 回答