2012-12-11 32 views
13

工作,我已经定义的属性...财产不能与getter和setter

@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是什么。

这是相同的任何方式。它适用于一个功能,但只要我添加其他功能,它们都会失败。

有什么我需要做的呢?看起来奇怪的是,它可以与两个机器人都工作。

+3

你有类中定义了_eventTypes吗?除了属性外,还需要在头文件中声明变量。另外(我对此也不是100%肯定),即使你正在编写自己的getter和setter(这样,你的getter和setter覆盖了合成的),你也可能需要在该属性上使用'@ synthesize'。 – benwad

+3

'@synthesize eventTypes = _eventTypes;'会做诡计 – Alladinian

+1

从Xcode 4.5开始,您不再需要'@ synthesize'属性。说了这么多,我添加了@ @ synthesize',它工作了!奇怪的!谢谢 – Fogmeister

回答

2

@implementation

@synthesize eventTypes = _eventTypes; 
+1

感谢您的回答:D – Fogmeister

+0

@Fogmeister :-) –

-8

试试这个:

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

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

    return self.eventTypes; 
} 
+0

这将导致无限循环,永远不要使用。 – Logan

+0

@Logan,除非你喜欢无限循环 – codrut

1

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

  • 读/写属性与自定义getter和setter;
  • ReadOnly属性与自定义getter;

权.m文件的@implementation后,放入:

@synthesize propertyName = _propertyName; 

这告诉编译器,你想要得到的方法“GET”和具体的“设置”控制属性。所以之后,你的set和get的实现将会正常工作。


额外的解释:

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

因此,如果我们称自己为。属性里面的set方法我们将创建一个无限循环。一旦我们重写了方法'set'和'get',我们必须使用_而不是自我。

+0

这个问题在4年前得到了回答,你的答案与接受的答案几乎相同。 – Fogmeister

+1

我来自一个与你很相似的最新问题。我刚刚看到那个人放了一个链接。无论如何抱歉,如果我打扰你,我会离开我的答案,如果有人没有看到链接,并在这里读一个小解释。谢谢你的评论。 –

+1

够公平的。 :) – Fogmeister