2012-09-11 84 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

相關問題