分配给只读属性错误iOS 6

时间:2013-02-02 20:04:05

标签: ios objective-c properties ios6 attributes

我有一个名为Constants的Singleton类,我需要在那里设置一些应用程序范围的常量。我喜欢这些常数只是readonly。所以我在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方法中初始化我的readonly变量吗?如果不是我如何初始化它们?

3 个答案:

答案 0 :(得分: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 cat = dog;

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

答案 1 :(得分: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。

答案 2 :(得分: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_LNGConstants.h,而且您不必处理属性或接口。

正是这种事情发生了const

相关问题