【问题标题】:Creating an array that contains only objects of a given class创建一个只包含给定类的对象的数组
【发布时间】:2010-11-10 09:56:47
【问题描述】:

好的,所以我有下面的代码(Objective-C FYI),我想知道是否要创建一个 c_data 对象的 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 类,我正在尝试将 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

【问题讨论】:

  • 不是答案,而是评论:类名“c_data”完全超出了 Objective-C 的约定。类名应采用 CamelCase 格式,以大写字母开头。
  • 注意:与此 SO 问题相关 — stackoverflow.com/questions/1120067

标签: objective-c generics collections strong-typing


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢。我注意到你过去回答了我的几个问题。整个夏天你都帮了我很大的忙。
【解决方案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;
}

【讨论】:

  • 啊,谢谢你的帮助。关于一个相关但完全不同的主题,您建议购买哪本包含大多数编程概念的 c++ 书籍?我让我通过语法的那个很好,但仅此而已。它没有讨论太多过去的事情。如果这是一本好书,我不介意付出高昂的代价。
  • 你问错人了。我建议根本不要购买 C++ 书籍。但是,如果您的意思是我建议的 Objective-C 书;我想说仔细查看developer.apple.com 上的 Apple 编程参考资料是一个好的开始。
  • 如果你不使用垃圾回收,那就是内存泄漏。将对象添加到数组后,需要释放它。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2014-07-29
    相关资源
    最近更新 更多