2012-06-01 39 views
1

我敢肯定,這是一個完整的noob問題...但我其實從來沒有過,所以我有點糊塗應對這種情況...訪問一個NSMutableArray我的自定義對象的內部

比方說,我有一個自定義對象,我會稱之爲人,每個人物都可以擁有一系列「財產」,如果您願意的話,可以是一種庫存。我將它設置這樣的:

interface person : NSObject { 
    NSString *name; 
    NSMutableArray *posessions; 

@property (copy) NSString *name; 
@property (copy) NSMutableArray *posessions; // no idea if this is even necessary... 

} 

當然,我也將我的綜合性能在實現文件...現在,在我的實際控制對象,我會做我的對象的實例(或通常實例的數組,但在這個例子中,一個做工精細...)像這樣:

person *aPerson; 

我知道,訪問的人的名字,我能做出這樣的呼籲:

[aPerson setName:@"Bob"]; 

並檢索已經這個名字,我可能會使用這樣的:

aVar = [aPerson name]; 

什麼我卡上是我會究竟如何去增加或檢索位於我個人類中對象的NSMutableArray中?假設我想爲NSMutable Array使用「count」方法。

我已經做了一些嘗試和錯誤與嘗試,如:

[aPerson.posessions count]; 
[[aPerson posessions] count]; 

同樣,一個對象添加到一個數組,我經常使用:

[someArray addObject:anObject]; 

但嘗試這樣的沒有工作:

[aPerson.posessions addObject:anObject]; 

在讀了一堆和搜索網絡後,我似乎無法找到準確如何在我的自定義類中與此NSMutableArray進行交互。我敢肯定這是明顯的,我只是沒有得到,它已成爲一種心理障礙...

此外,我正確的綜合NSMutableArray的訪問器屬性?如果是這樣,setX和X似乎不是那麼明顯與NSMutableArray ...除非他們簡單地將整個陣列複製到本地變量...

也許這是需要做什麼?使用訪問器方法獲取整個數組,將其放置在局部變量中,進行更改,然後使用set訪問器方法將整個數組放回到person對象中?

有人能讓我對我應該在這裏使用的語法有點?

*編輯*

我想我有點澄清添加到這個問題。我的自定義對象(在上面的例子中,我的人物對象)基本上是數據庫記錄。我在我的項目中使用了幾個數據庫,例如:

Person - 包含多個NSString對象以及Ints和BOOL的NSObject的自定義子類。

personDatabase - Person對象(設置和我的主控制器對象中控制)

所有set和get方法都是從「控制器」之稱的數組。

我一直在試圖做的是直接從我的Controller對象中訪問personDatabase中包含的單個對象。我已經通過聲明另一個對象這種方式做到了這一點:

someOutput = [activePerson name]; 

Person *activePerson; 

然後,我所有的電話都到當前活躍的人記錄(目前從personDatabase選擇的一個),例如發

有沒有辦法直接訪問我的Controller對象中的activePerson對象內的NSMutableArray對象內的對象?

+0

當你說「這樣的嘗試沒有奏效」,你的意思是它沒有將它添加到數組中,或者它得到一個錯誤? –

+0

無論我嘗試如何操作它,數組總是返回0的計數,所以它要麼根本不添加對象,要麼完全是意想不到的(對我來說)。我主要試圖理解用於添加對象或從數組讀取對象的正確語法。 –

回答

2

您已將'所有'屬性指定爲'複製'。因此,當你編寫aPerson.possessions時,你正在獲取一個擁有數組的副本。對addObject的調用將anObject添加到一個新陣列,該陣列是aPerson的所有陣列的副本。最簡單的「修復」是將「複製」更改爲「保留」(可能是「只讀」)。 [編輯:錯誤;它是'複製分配' - 而不是'讀取複製']

但是,還有一個更大的問題。一個人擁有財產,但你如何存儲他們是一個實現細節。當你將公共接口放入NSMutableArray時,你會過度地限制你的實現。你可能會得到更好的服務來改變沿行的人接口:

@interface Person : NSObject { 
@private 
    NSString *name; 
    // ... 
    } 
    - (Boolean) addPossession: (NSObject *) obj; 
    - (Boolean) remPossession: (NSObject *) obj; 
    - (Boolean) hasPossession: (NSObject *) obj; 
    - (NSArray *) allPossessions; 
@end 

那麼,如何實現這些佔有方法取決於你使用一個數組,一組,鏈表,樹,隨你。

+0

我希望那麼數組的'副本'應該返回1的計數然後...在上面的例子中,計數方法返回0,我認爲這意味着沒有對象被添加到數組中。在這種特殊情況下,它不會增加數組的正確實例,它不會增加一個對象給數組的任何實例。我在想這是我的語法問題。 –

+0

啊。沒有想過這樣做。當然是一種乾淨的「面向對象」方法。我很確定這會解決我的問題。這實際上是這個項目中我的任何自定義類中包含的唯一數組。其他每個iVar都是非數組,所以我已經能夠使用accessor方法來完成這一切。 –

+0

*每次*你打電話aPerson.possessions你會得到另一個新的副本(其中將有0個對象)。 [aPerson.possessions addObject:obj]; NSAssert(0 == [aPerson.possessions count]); – GoZoner

相關問題