在Xcode 8
中遇到非常奇怪的错误:
我在.h
档案中获得了属性:
@property (nonatomic) BOOL isInAirmode;
.m
中的访问者:
- (void)setIsInAirmode:(BOOL)isInAirmode
{
_isInAirmode = isInAirmode;
[self da_postEvent:self.isInAirmode ? DAEventAirON : DAEventAirOFF];
}
- (BOOL)isInAirmode
{
return _isInAirMode || _isTrailer;
}
我收到了编译错误。但是当我移除吸气剂时,一切都很好。那是为什么?
派生数据被清理了好几次,我只是想知道这怎么可能?
答案 0 :(得分:1)
你需要特定的
@property (nonatomic) BOOL isInAirmode;
as
@property (assign,getter= _isInAirmode) BOOL isInAirmode;
答案 1 :(得分:1)
这不是一个包。 Xcode 7上的行为相同。
当你实现getter时,LLMV不生成实例变量,因为它不知道,你真的需要它吗?
所以你需要手动添加它。
有几种方法可以做到这一点:
在类定义或类扩展或类实现中,甚至是@synthesize isInAirmode = _isInAirmode;
bool属性的代码风格的常见建议:
在没有is
动词的情况下声明它们,在getter中添加is
。
在你的美食中它将是:
·H
@property (nonatomic, getter = isInAirmode) BOOL inAirmode;
的.m
@synthesize inArimode = _inArimode;
- (void)setInAirmode:(BOOL)inAirmode
{
if (_inArimode == inArimode) {
return;
}
_inAirmode = inAirmode;
[self inAirmodeDidChange];
}
- (BOOL)isInAirmode
{
return _inAirMode || _trailer;
}
- (void)inAirmodeDidChange
{
[self da_postEvent:self.isInAirmode ? DAEventAirON : DAEventAirOFF];
}
答案 2 :(得分:0)
我猜测对于BOOL, 是 前缀在内部保留用于变量的getter。在https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Conventions/Conventions.html中它说:
除非另有说明,否则getter方法应使用相同的名称 作为财产。对于名为firstName的属性,访问器方法 也应该被称为firstName。此规则的例外是 布尔属性,getter方法应该从哪个开始。 例如,对于名为paused的属性,getter方法应该是 叫做暂停。
属性的setter方法应使用setPropertyName:形式。 对于名为firstName的属性,应调用setter方法 setFirstName :;对于名为paused的布尔属性,setter方法 应该叫做setPaused:。
虽然@property语法允许您指定不同的访问者 方法名称,您应该只对布尔值这样的情况这样做 属性
因此,您不应使用前缀 。 只需将BOOL的名称更改为例如:
@property (nonatomic) BOOL inAirmode;
然后您可以在设置器中使用 _inAirmode 。