不使用getter和setter的属性

时间:2012-12-11 09:49:42

标签: ios properties

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

@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 个答案:

答案 0 :(得分:20)

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

您可以在此处详细了解:http://useyourloaf.com/blog/2012/08/01/property-synthesis-with-xcode-4-dot-4.html

答案 1 :(得分:2)

@implementation

中添加此内容
@synthesize eventTypes = _eventTypes;

答案 2 :(得分: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。

答案 3 :(得分:-8)

试试这个:

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

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

    return self.eventTypes;
}