【问题标题】:Objective C creating custom arraysObjective C 创建自定义数组
【发布时间】:2009-06-24 15:34:26
【问题描述】:

在其他语言中,我可以创建一个类,然后使用它在该类中创建一个对象数组,例如在性能类中用于定义价格 [] 价格的类价格;

在 Objective C 中我无法让它工作,你是怎么做到的?

价格类是NSObject的继承,我可以使用NSMutableArray吗?

【问题讨论】:

  • 我不太确定你在问什么……你能改写一下吗?你是说你想要一个价格类的实例数组,还是一个价格类的 ivar 的 NSArray ......或其他什么?你到底想完成什么你做不到的事情?
  • 你说你可以创建一个“自定义数组”?在其他语言中。就像在 C?如果它是 C/C++,您能否给我一个框架示例,说明您将如何在那里进行并澄清您的问题,因为正如我之前所说,我不太确定您在问什么。

标签: objective-c arrays memory-management


【解决方案1】:

如果你有一个 Price 类,并且它继承自 NSObject,那么你可以将它们的数组存储在 NSArray 或 NSMutableArray 中。您也可以将它们存储在 C 数组或 STL 向量中,尽管在这些情况下内存管理语义可能很困难。

在 NSArray/NSMutableArray 的情况下,数组获取对象的所有权引用,因此您可以在将其添加到数组后释放它,并且它将保留在内存中,直到它从数组中删除(以及所有其他位置)。

代码可能如下所示:

NSMutableArray* a = [NSMutableArray array];
[a addObject:[Price price]];
// and/or
[a addObject:[[[Price alloc] init] autorelease];
// and/or
Price* p = [[Price alloc] init];
[a addObject:p];
[p release];
NSLog( @"The array is %@", a );
// Remember at this point you do not "own" a, retain it if you want to keep it, or use [NSMutableArray new] above

当 a 被释放时,它包含的所有 Price 对象都将被释放(并可能被释放)。

【讨论】:

    【解决方案2】:

    是的,NSMutableArray 就是您想要使用的。

    【讨论】:

      【解决方案3】:

      首先回答您的最后一个问题:如果您要存储 Objective-C 对象的实例(正如您所说,它是从 NSObject 继承的),那么可以,使用 NSMutableArray。但是,这不适用于原始类型(如intBOOLcharchar* 等)。

      Objective-C 使用 C 声明数组的方式有一个警告:您不能在堆栈上分配内存(这在 C 中是这样做的),只能在堆上。这意味着您必须使用malloc(在Leopard 或更高版本上更喜欢NSAllocateCollectable())和free 来管理内存。此外,您将数组声明为指向一个或多个数组的指针。像这样的东西:(注:凭空捏造,未经测试。)

      Price **prices = malloc(numberOfEntries * sizeof(Price*));
      ...
      free(prices);
      

      使用 NSMutableArray 通常比管理自己的数组容易得多。请注意内存管理规则:集合在插入对象时调用-retain,在删除对象时调用-release(如果集合被释放,则在所有对象上调用)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-16
        • 1970-01-01
        相关资源
        最近更新 更多