getter ios目标c的递归问题

时间:2012-11-05 00:03:16

标签: objective-c ios

我有这个属性:

@property (nonatomic, getter = getSolutionsCount, setter = setSolutionsCount:) NSInteger solutionsCount;

和实施

- (NSInteger)getSolutionsCount {
    return self.solutionsCount;
}

我在此方法- (NSInteger)getSolutionsCount上获得了EXC_BAD_ACCESS。

我在这里做错了什么?

4 个答案:

答案 0 :(得分:3)

self.solutionsCount行被翻译为[self getSolutionCount]。你正在进行递归通话。

如果您只想返回合成的ivar,那么甚至不要实现此方法。但如果你这样做,那么只需致电return _solutionCount;

答案 1 :(得分:3)

点语法基本上是调用getter的快捷方式。你的getter方法中有无限递归。

您需要做的是直接返回实例变量:

- (NSInteger)getSolutionsCount {
    //latest xcode makes variables with _property name automatically
    return _solutionsCount;

    //older versions of xcode or having written @synthesize solutionsCount
    //will necessitate
    //return solutionsCount;
}

同样只是FYI objective-c约定是将getter方法定义为变量名。如果您没有在属性声明

中编写getter,则假定使用与属性名称相同的getter

编辑: 另外我假设这不是你的getter的整个实现,因为如果它让编译器自动为你做,你不需要写任何东西。 (或者使用旧版本的xCode在您的实现块中编写@synthesize propertyName = _propertyName

答案 2 :(得分:2)

问题是self.solutionsCount[self getSolutionsCount]相同,所以你的getter是直接递归的。您可能希望直接访问底层的ivar,为此使用self->_solutionsCount。或者,如果您不想明确使用self,只需_solutionsCount

答案 3 :(得分:2)

这里有几个问题:

  1. 根据命名规则,getter不应该以get开头。要阅读使用self.solutionsCount所需的值。因此,您无需在属性声明中指定getter方法的名称。

  2. 您无需指定设置器的名称,因为它将自动生成。

  3. 该属性应如下所示:

    @property (nonatomic, assign) NSInteger solutionsCount;
    
    1. 您无需编写自定义getter实现即可使其正常工作。请求编译器为您合成方法:

      @synthesize solutionsCount;

    2. 如果您想直接访问实例变量,请让编译器为您进行合成:

      @synthesize solutionsCount = _solutionsCount;
      
      1. 首先阅读objective-c和命名约定文档。他们会帮助很大。
      2. 祝你好运!