2009-07-13 131 views
1

好的,所以我有下面的代碼(Objective-C FYI),我想知道如果我想創建一個對象的NSMutableArray,我將如何去做?這有點像在C#中聲明List<c_data> cData創建一個只包含給定類的對象的數組

@interface c_data : NSObject { 
    double value; 
    int label; 
    int ID; 
}  
@property double value; 
@property int label; 
@property int ID; 

-(c_data*) init; 
-(c_data*) initWithValue:(double)value;  
@end 

@implementation c_data 
@synthesize value, label, ID; 
-(c_data*) init { 
    return self; 
} 
-(c_data*) initWithValue:(double)val { 
    value = val; 
    return self; 
} 
@end 

如果你看一下類feat_data,我試圖讓cDatac_data的數組。我已經包括了我的嘗試,但我不認爲這是正確的,因爲c_data不是一個數組。有什麼建議麼?

@interface feat_data : NSObject { 
    NSMutableArray *nData; 
    NSMutableArray *cData; 
    char type; 
} 
@property(nonatomic, retain) NSMutableArray *nData; 
@property(nonatomic, retain) NSMutableArray *cData; 
@property char type; 
-(feat_data*)init; 
@end 

@implementation feat_data 
@synthesize nData, cData, type; 
-(feat_data*)init { 
    nData = [[NSMutableArray alloc] init]; 
    c_data *c_dataInstance = [[c_data alloc] init]; 
    cData = [[NSMutableArray alloc] initWithArray:c_dataInstance]; 
    return self; 
} 
@end 
+2

不是一個答案,而是一個評論:類名「c_data」在Objective-C約定之外是瘋狂的。類名應該在CamelCase中以大寫字母開頭。 – Chuck 2009-07-13 18:46:27

+0

注:與此有關的SO問題 - http://stackoverflow.com/questions/1120067/ – 2009-07-13 18:56:12

回答

2
[NSMutableArray addObject:[[[c_data alloc] init] autorelease]]; 

Objective-C數組沒有輸入。看起來你有一些C++無法學習。

在一個相關的說明,你的inits是非常糟糕的。您還需要調用超級初始化,例如:

- (id)init { 
    self = [super init]; 
    if (self != nil) { 
    //Initialize here. 
    } 
    return self; 
} 
+0

啊,感謝您的幫助。在一個相關但完全不同的話題上,你會建議購買什麼C++書籍,其中包含大部分編程概念?我通過語法很好的讓我知道了,但就是這樣。它沒有討論過去那麼多。如果它是一本好書,我不介意付出巨大的代價。 – 2009-07-13 19:35:12

2

您將創建一個NSMutableArray並將c_data對象插入到它中。

3

Objective-C中沒有靜態類型/模板/泛型集合。基本上,強類型集合的意義在於在編譯時提供靜態類型安全性。在像Objective-C這樣具有動態性的語言中,這種方法毫無意義。 Objective-C集合中不同對象類型問題的解決方法是:只插入適當的對象類型。 (另外,請記住數組將保留它包含的對象,因此如果插入新對象而沒有釋放,並且丟失指針,則表明內存泄漏。)

如果您仔細考慮,泛型最大的好處是能夠直接從集合中檢索對象到靜態類型變量中而不需要投射。在Objective-C中,您可以將變量存儲到一個id,併發送您喜歡的任何消息,而不必擔心ClassCastException,或者編譯器抱怨對象沒有(可能不會?)實現您嘗試調用的方法。如果需要,您仍然可以靜態鍵入變量並投射結果,但更簡單的方法是使用動態類型(如果需要,則使用-isKindOfClass:-respondsToSelector:)。

順便說一句,堆棧溢出時有幾個相關的這個問題的化身。知道要搜索的術語(「通用」,「強類型」或「模板」)可以幫助找到它們。這裏有幾個:

最後,我與威廉同意 - 你的init方法是您提供的樣本中非常令人震驚的。在Objective-C中學習並遵守蘋果的Allocating and Initializing Objects規則。它需要打破來自其他語言的習慣,但它會爲您在路上的某個時刻節省無窮的精力。 :-)

相關問題