创建一个只包含给定类的对象的数组

问题描述:

好的,所以我有下面的代码(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://*.com/questions/1120067/ – 2009-07-13 18:56:12

[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

您将创建一个NSMutableArray并将c_data对象插入到它中。

Objective-C中没有静态类型/模板/泛型集合。基本上,强类型集合的意义在于在编译时提供静态类型安全性。在像Objective-C这样具有动态性的语言中,这种方法毫无意义。 Objective-C集合中不同对象类型问题的解决方法是:只插入适当的对象类型。 (另外,请记住数组将保留它包含的对象,因此如果插入新对象而没有释放,并且丢失指针,则表明内存泄漏。)

如果您仔细考虑,泛型最大的好处是能够直接从集合中检索对象到静态类型变量中而不需要投射。在Objective-C中,您可以将变量存储到一个id,并发送您喜欢的任何消息,而不必担心ClassCastException,或者编译器抱怨对象没有(可能不会?)实现您尝试调用的方法。如果需要,您仍然可以静态键入变量并投射结果,但更简单的方法是使用动态类型(如果需要,则使用-isKindOfClass:-respondsToSelector:)。

顺便说一句,堆栈溢出时有几个相关的这个问题的化身。知道要搜索的术语(“通用”,“强类型”或“模板”)可以帮助找到它们。这里有几个:

最后,我与威廉同意 - 你的init方法是您提供的样本中非常令人震惊的。在Objective-C中学习并遵守苹果的Allocating and Initializing Objects规则。它需要打破来自其他语言的习惯,但它会为您在路上的某个时刻节省无穷的精力。 :-)