我有这个属性:
@property (nonatomic, getter = getSolutionsCount, setter = setSolutionsCount:) NSInteger solutionsCount;
和实施
- (NSInteger)getSolutionsCount {
return self.solutionsCount;
}
我在此方法- (NSInteger)getSolutionsCount
上获得了EXC_BAD_ACCESS。
我在这里做错了什么?
答案 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)
这里有几个问题:
根据命名规则,getter不应该以get开头。要阅读使用self.solutionsCount
所需的值。因此,您无需在属性声明中指定getter方法的名称。
您无需指定设置器的名称,因为它将自动生成。
该属性应如下所示:
@property (nonatomic, assign) NSInteger solutionsCount;
您无需编写自定义getter实现即可使其正常工作。请求编译器为您合成方法:
@synthesize solutionsCount;
如果您想直接访问实例变量,请让编译器为您进行合成:
@synthesize solutionsCount = _solutionsCount;