2012-09-11 54 views
1

让我们说,如果已经存在的是否有一种方法在Objective-C中具有伪属性?

@property (strong, nonatomic) JJNode *leftChild; 
@property (strong, nonatomic) JJNode *rightChild; 

类属性和应用已经广泛使用的if (parent.leftChild) { ... }parent.leftChild = newNode(getter和setter方法)。

但是,如果左右儿童可以用NSMutableArray对象表示,那么该类可能会更好,因此该类可以在将来支持N-children,并且通过孩子循环更容易。

所以这将是

@property (strong, nonatomic) NSMutableArray *childrenArray; 

,并在某些情况下,孩子们可以通过

for (JJNode *node in self.childrenArray) { ... } 

迭代但是使用这个新的数组,可我们仍然能够继续使用parent.leftChildparent.leftChild = newNode

我不知道这是否是一种好的做法,因为它可能看起来像parent.leftChild(JJNode *)[parent objectAtIndex: 0]是不同的对象,但实际上是相同的东西。但是,如果我们继续这样做,我们是否可以拥有伪造财产来实现这一目标?

看来我们实际上可以使用@property (strong, nonatomic) JJNode *leftChild;并更改getter和setter以实际使用数组,但会有两个额外的实例变量。它可以在没有ivars的情况下完成吗?或者我们可以定义2种方法,这样parent.leftChild = newNode实际上会调用一些setter方法,并且parent.leftChild会调用getter?

+0

这是一个非常糟糕的主意。索引超出界限例外吗? –

+0

但是,您可以拥有一个自定义实现的属性,只需在您的实现中定义'-setLeftChild:'方法 –

回答

4

您的属性不限于合成的 - 实际上,它们不过是一对遵循特定命名约定的方法。

可以删除@synthesize说明了leftChildrightChild,并与获取方法/设置第一和保存节点的情况下,当有两个以上的NSArray的第二元素替换它们。

+0

必须有两个实际上未使用的额外实例变量? –

+0

@JeremyL你可以完全删除实例变量,并使用'NSArray'来保存双方。 – dasblinkenlight

+0

@JeremyL:属性不是实例变量。这是一个getter(可能是setter)方法的抽象。通常它所获取或设置的是一个实例变量,但与其他任何getter或setter类似,这不是必需的。如果你没有'@综合'这些变量,就不会有任何变量。 – Chuck

相关问题