1

好的,所以我有下面的代码(Objective-C FYI),我想知道是否要创建一个 NSMutableArrayc_data对象,我该怎么做呢?这有点像List<c_data> cData在 C# 中声明 a 。

@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,我正在尝试制作cData课程的数组c_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
4

3 回答 3

3

Objective-C 中没有静态类型/模板/泛型集合之类的东西。基本上,强类型集合的重点是在编译时提供静态类型安全。在像 Objective-C 这样动态的语言中,这种方法几乎没有意义。解决 Objective-C 集合中不同对象类型问题的方法是仅插入适当的对象类型。(另外,请记住,数组将保留它包含的对象,因此如果您插入一个新对象而不释放并且丢失了指向它的指针,那么您就是在泄漏内存。)

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

顺便说一句,这个问题在 Stack Overflow 上有几个相关的化身。了解要搜索的术语(“通用”、“强类型”或“模板”)有助于找到它们。这里有几个:

最后,我同意 William 的观点——在您提供的示例中,您的 init 方法非常糟糕。你最好学习并注意 Apple在 Objective-C中分配和初始化对象的规则。它需要打破其他语言的习惯,但它会在以后的某个时候为你节省数小时的精神错乱。:-)

于 2009-07-13T20:06:47.343 回答
2

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

于 2009-07-13T18:45:24.167 回答
2
[NSMutableArray addObject:[[[c_data alloc] init] autorelease]];

Objective-C 数组没有类型。看来你有一些 C++ 学习要做。

在相关的说明中,您的初始化非常糟糕。您还需要调用 super init,例如:

- (id)init {
  self = [super init];
  if (self != nil) {
    //Initialize here.
  }
  return self;
}
于 2009-07-13T18:46:09.703 回答