ban*_*ing 0 attributes properties objective-c ios ios6
我有一个名为常量的Singleton类,我需要在那里设置一些应用程序范围的常量.我喜欢这些常数只是readonly.所以我在Constants.h文件中执行了以下操作
@interface Constants : NSObject
{
}
@property (nonatomic, readonly)double U_LAT;
@property (nonatomic, readonly)double U_LNG;
Run Code Online (Sandbox Code Playgroud)
然后在我的.m文件中我得到了这个方法
-(id)init
{
self = [super init];
self.U_LAT = 49.2765;
self.U_LNG = -123.2177;
return self;
}
Run Code Online (Sandbox Code Playgroud)
我从这段代码中得到了这个错误:
Assignment to readonly property
Run Code Online (Sandbox Code Playgroud)
我可以不在init方法中初始化我的readonly变量吗?如果不是我如何初始化它们?
Jos*_*ell 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;
}
Run Code Online (Sandbox Code Playgroud)
如果允许自动合成属性,则ivar的名称将是以下划线为前缀的属性名称.如果你有明确的@synthesize propName;,那么ivar将具有相同的名称.您还可以使用synthesize语句创建具有您喜欢的任何名称的变量:@synthesize cat = dog;
该物业也可以是公开的只读,但可以由该类写入; 这涉及在类扩展中声明 setter方法或在扩展中重新声明属性.
我认为更好的方法是在私有接口中重新声明属性,如下所示:
// .h
@interface Constants : NSObject
@property(nonatomic, readonly) double U_LAT;
@end
// .m
@interface Constants ()
@property(nonatomic, readwrite) double U_LAT;
@end
Run Code Online (Sandbox Code Playgroud)
是的,在inits和dealloc中,直接将变量称为_U_LAT.