声明@property(非原子)BOOL varname时,使用带有_varname的underclared标识符

时间:2016-09-27 13:36:39

标签: ios objective-c xcode xcode8

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;
}

我收到了编译错误。但是当我移除吸气剂时,一切都很好。那是为什么?

xcode 8 bug

派生数据被清理了好几次,我只是想知道这怎么可能?

3 个答案:

答案 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