2

在现代版本的 Xcode 中,会自动创建变量来支持属性。例如,@property (nonatomic, assign) BOOL isOpen将自动创建BOOL _isOpen. 当属性是非物理的时,有没有办法防止创建此类变量?在下面的非物理isOpen属性示例中,_isOpen不需要。这实际上是有害的,因为我有同事无意中使用_isOpen并想知道为什么什么都不会发生。

- (void) setIsOpen:(BOOL)isOpen
{
    if (isOpen) {
        [self.specialView open]
    } else {
        [self.specialView close];
    }
}

- (BOOL) isOpen
{
    return self.specialView.alpha > 0.0;
}
4

2 回答 2

3

如果同时实现 setter 和 getter,则不会创建变量。来自Apple 的文档

编译器将在所有情况下自动合成实例变量,其中它还合成了至少一个访问器方法。如果您同时为属性实现 getter 和 setter readwrite,或者为属性实现 getter readonly,编译器将假定您正在控制属性实现并且不会自动合成实例变量。

您的同事应该根本无法参考_isOpen。我在 Xcode 4.6.3 中检查了您的代码,它的行为符合规范 - 没有创建变量。

于 2013-10-31T00:25:53.570 回答
1

您需要同时指定 getter 和 setter。假设您这样做,则不会创建任何实例变量。

请注意,您也可以为 getter 指定不同的名称。对于布尔属性,is前缀通常被删除,但在“打开”的情况下我可能会留下它。我认为前缀更清楚。

但是,对于其他布尔属性,可能更喜欢这样的东西:

@property (nonatomic, assign, getter=isOpen) BOOL open;

然后:

  • 实施setOpenisOpen
  • 阅读使用BOOL value = object.openBOOL value = [object isOpen]
  • object.open = value使用or编写[object setOpen:value]

@dynamic不需要使用;最近的编译器会检测到您已经指定了 getter 和 setter。@synthesize也不应该是必要的。(有一些边缘情况;如果遇到必要的情况,一定要在那里使用它)。

但是请注意,我在这里谈论的是现代运行时。32 位 OSX 目标使用具有不同规则的旧版运行时。

于 2013-10-31T00:33:51.333 回答