Objective C中的属性(自我读写,其他读取)

时间:2014-09-18 13:06:53

标签: ios objective-c properties

在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

1 个答案:

答案 0 :(得分:3)

此代码:

str = [[NSString alloc] initWithString:@"hello"];

不会调用属性setter,它会引用您直接定义的实例变量:

@interface TheClassName : NSObject {
     NSString* str;
}

并且,默认情况下,后备实例变量将被称为_str,因此您应该删除该实例变量定义并直接引用_str(如果您不想创建readwrite版本的属性)。目前,属性str不会在未明确使用str语句的情况下引用实例变量@synthesize str = str;