insertObject不添加对象?

问题描述:

我想通过Obj-C摸索我的方式来构建一款iPhone游戏。insertObject不添加对象?

我想构建一个对象数组供以后使用。下面是我的尝试:

NSMutableArray  *positionIcons; 
[positionIcons insertObject:annotation atIndex:0]; 
positionIcons = [NSArray arrayWithObjects:annotation, nil]; 

的insertObject线离开计数为0。但是,下一行正确插入对象(和计数移至1)。是什么赋予了?

需要初始化positionIcons,代码更改为:

NSMutableArray *positionIcons = [[NSMutableArray alloc] init]; 
[positionIcons insertObject:annotation atIndex:0]; 
positionIcons = [NSArray arrayWithObjects:annotation, nil]; 
+0

哇 - 快速和完美。我一直在撕掉我的头发。 – BankStrong 2009-07-17 15:36:02

@msaeed有正确的答案,但它是值得考虑多一点时间上的代码片段,因为它出现内存泄漏。

The iPhone doesn't support garbage collection,因此了解Objective-C的半自动内存管理是如何工作是很重要的。 Apple has a good reference here,但其要点在于您负责维护对象的“保留计数”。当使用-init实例方法初始化对象时(例如在您的示例中为[[NSMutableArray alloc] init],但也包括以“init”开头的任何其他方法(如[[NSMutableArray alloc] initWithCapacity:42]),则新初始化对象的保留计数为1.随后调用该实例的-retain方法增加保留计数,同时调用实例的-release方法减少计数值,当计数值达到0时,释放该对象,并进一步尝试发送它的消息将导致空指针例外

在@ msaeed的更正的代码,这里是发生了什么,按行:

  1. 的新实例被分配;调用-init方法,该方法初始化实例并将保留计数设置为1.然后将positionIcons指针设置为此新实例的地址。
  2. positionIcons上调用-insertObject:atIndex:方法,并且一切都很好(同样,按照约定将对象添加到集合中,例如增加该对象的保留计数,该集合现在具有某种意义上的“所有权”该对象,并且不希望它从其下面被释放)。
  3. 分配NSArray的新实例,然后positionIcons指针被设置为该新实例的地址。因为第一行的NSMutableArray的保留计数仍然为1,所以它不会被释放,并且由于您已经失去了对它的引用,所以您永远无法调用-release将其清除内存。有你的泄漏。

按照惯例,有一个在你如何管理与-init实例方法与类的方法,如+arrayWithObjects:(在第一种情况下初始化的对象的不同,你必须自己释放对象,而在第二种情况下,对象已经发送了一条-autorelease消息,并且将在下一次通过程序的runloop时释放它,除非您致电-retain

+0

谢谢 - 内存泄漏问题在我的代码中(我确信msaeed不想通过同时修复来混淆) 当我学习obj-C时,我故意泄漏内存。我有更多的知识后,我打算回到自己身后。你的例子对此很有帮助。 – BankStrong 2009-07-20 12:04:48