13

我已经定义了一个属性...

@property (nonatomic, strong) NSArray *eventTypes;

我想覆盖getter和setter ...

我写了这个...

- (void)setEventTypes:(NSArray *)eventTypes
{
    _eventTypes = eventTypes;

    //do some stuff here.
}

这很好用,但是当我添加这个时......

- (NSArray*)eventTypes
{
    //do some stuff here.

    return _eventTypes;
}

然后这两个函数都显示错误并且不知道 _eventTypes 是什么。

这两种方式都是一样的。它适用于一个功能,但一旦我添加另一个功能,它们都会失败。

我还需要为此做些什么吗?似乎很奇怪,它可以与任何一个机器人一起工作,而不是同时与两者一起工作。

4

4 回答 4

20

尽管 LLVM 会自动合成支持 ivar(默认情况下以下划线为前缀),但如果您同时实现 getter 和 setter 方法,您将不会获得自动合成的 ivar,这就是您必须@synthesize eventTypes = _eventTypes;手动的原因。

您可以在此处阅读更多信息:http: //useyourloaf.com/blog/2012/08/01/property-synthesis-with-xcode-4-dot-4.html

于 2012-12-11T10:13:48.797 回答
2

添加这个@implementation

@synthesize eventTypes = _eventTypes;
于 2012-12-11T10:08:36.747 回答
1

你必须@synthesize 你的财产。当我们想要创建自定义 getter 和 setter 时,我们会使用它,例如:

  • 使用自定义 getter 和 setter 读取/写入属性;
  • 具有自定义 getter 的 ReadOnly 属性;

在 .m 文件中的@implementation之后,添加:

@synthesize propertyName = _propertyName;

这告诉编译器您想要控制该特定属性的“get”和“set”方法。因此,在那之后您的 set 和 get 实现将正常工作。


额外说明:

self.anyString = @"TEXT" ; 完全等价[self setAnyString:@"TEXT"]; 这两个都在调用方法集。如果您使用_anyString,您将直接访问该属性,而无需通过 set 方法。

因此,如果我们在 set 方法中调用self.property,我们将创建一个无限循环。一旦我们重写了 'set' 和 'get' 方法,我们必须使用_而不是self。.

于 2016-04-27T13:27:52.603 回答
-8

试试这个:

- (void)setEventTypes:(NSArray *)eventTypes
{
    self.eventTypes = eventTypes;

    //do some stuff here.
}
- (NSArray*)eventTypes
{
    //do some stuff here.

    return self.eventTypes;
}
于 2012-12-11T13:34:55.413 回答