在iOS应用程序中,我需要一个属性 readonly用于其他类但是为自己调用readwrite 。所以我跟着this question并形成了我的代码,
在.h:
@interface TheClassName : NSObject {
NSString* str;
}
@property(nonatomic, retain, readonly) NSString* str;
@end
在.m:
@interface TheClassName()
@property(nonatomic, retain, readwrite) NSString* str;
@end
@implementation TheClassName
-(id)init {
if(self = [super init]) {
str = [[NSString alloc] initWithString:@"hello"];
}
return self;
}
@end
此程序也适用于Apple Documentation。但我试着尝试我的代码,问题就开始了。
关于 Seva Alekseyev 的回答{{3},我所做的只是忽略 .m文件中的 @interface 部分},但是当我在 .m文件中使用str = [[NSString alloc] initWithString:@"hello"]
时,编译器没有显示任何警告或错误 !!
我的意思是,该属性设置为readonly
,因此该语句应该产生错误,但事实并非如此。 WHY ??
注意:我正在使用Xcode 5.1.1
答案 0 :(得分:3)
此代码:
str = [[NSString alloc] initWithString:@"hello"];
不会调用属性setter,它会引用您直接定义的实例变量:
@interface TheClassName : NSObject {
NSString* str;
}
并且,默认情况下,后备实例变量将被称为_str
,因此您应该删除该实例变量定义并直接引用_str
(如果您不想创建readwrite
版本的属性)。目前,属性str
不会在未明确使用str
语句的情况下引用实例变量@synthesize str = str;
。