首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Objective-C中的只读属性?

Objective-C中的只读属性?
EN

Stack Overflow用户
提问于 2011-01-04 01:05:41
回答 4查看 93K关注 0票数 97

我在接口中声明了一个readonly属性,如下所示:

代码语言:javascript
复制
 @property (readonly, nonatomic, copy) NSString* eventDomain;

也许我误解了属性,但我认为当您将其声明为readonly时,您可以在实现(.m)文件中使用生成的setter,但外部实体不能更改该值。This SO question说这就是应该发生的事情。这就是我所追求的行为。但是,当尝试使用标准的设置器或点语法在我的init方法中设置eventDomain时,它会给我一个unrecognized selector sent to instance.错误。当然,我是@synthesize的财产。尝试像这样使用它:

代码语言:javascript
复制
 // inside one of my init methods
 [self setEventDomain:@"someString"]; // unrecognized selector sent to instance error

那么,我是否误解了属性上的readonly声明?或者是发生了什么别的事情?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-04 01:09:27

你需要告诉编译器你也想要一个setter。一种常见的方法是将其放在.m文件的class extension中:

代码语言:javascript
复制
@interface YourClass ()

@property (nonatomic, copy) NSString* eventDomain;

@end
票数 120
EN

Stack Overflow用户

发布于 2011-01-04 01:12:05

你误解了另一个问题。In that question有一个类扩展,声明如下:

代码语言:javascript
复制
@interface MYShapeEditorDocument ()
@property (readwrite, copy) NSArray *shapesInOrderBackToFront;
@end

这就是生成仅在类的实现中可见的setter的原因。因此,正如Eiko所说,您需要声明一个类扩展并覆盖属性声明,以告诉编译器仅在类中生成setter。

票数 9
EN

Stack Overflow用户

发布于 2013-04-03 21:17:57

最短的解决方案是:

MyClass.h

代码语言:javascript
复制
@interface MyClass {

  int myProperty;

}

@property (readonly) int myProperty;

@end

MyClass.h

代码语言:javascript
复制
@implementation MyClass

@synthesize myProperty;

@end
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4586516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档