2

我有这个属性:

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

和实施

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

我在这个方法上得到了 EXC_BAD_ACCESS - (NSInteger)getSolutionsCount

我在这里做错了什么?

4

4 回答 4

3

该行self.solutionsCount被翻译为[self getSolutionCount]. 您正在进行递归调用。

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

于 2012-11-05T00:06:58.523 回答
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;
}

仅供参考,objective-c 约定是将 getter 方法定义为变量名。如果您不在属性声明中编写 getter,则假定与属性名称相同的 getter

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

于 2012-11-05T00:08:03.710 回答
2

问题在于它self.solutionsCount与 相同[self getSolutionsCount],因此您的 getter 是直接递归的。您可能希望直接访问底层 ivar,为此请使用self->_solutionsCount. 或者,如果您不想显式使用self,只需_solutionsCount.

于 2012-11-05T00:07:19.100 回答
2

这里有几个问题:

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

  2. 您不需要指定 setter 的名称,因为它会自动生成。

该属性应如下所示:

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

    @synthesize 解决方案计数;

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

@synthesize solutionsCount = _solutionsCount;
  1. 首先阅读objective-c 和命名约定文档。他们将提供巨大帮助。

祝你好运!

于 2012-11-05T00:14:32.040 回答