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];
@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的更正的代码,这里是发生了什么,按行:
- 的新实例被分配;调用
-init
方法,该方法初始化实例并将保留计数设置为1.然后将positionIcons
指针设置为此新实例的地址。 - 在
positionIcons
上调用-insertObject:atIndex:
方法,并且一切都很好(同样,按照约定将对象添加到集合中,例如增加该对象的保留计数,该集合现在具有某种意义上的“所有权”该对象,并且不希望它从其下面被释放)。 -
分配
NSArray
的新实例,然后positionIcons
指针被设置为该新实例的地址。因为第一行的NSMutableArray
的保留计数仍然为1,所以它不会被释放,并且由于您已经失去了对它的引用,所以您永远无法调用-release
将其清除内存。有你的泄漏。
按照惯例,有一个在你如何管理与-init
实例方法与类的方法,如+arrayWithObjects:
(在第一种情况下初始化的对象的不同,你必须自己释放对象,而在第二种情况下,对象已经发送了一条-autorelease
消息,并且将在下一次通过程序的runloop时释放它,除非您致电-retain
。
谢谢 - 内存泄漏问题在我的代码中(我确信msaeed不想通过同时修复来混淆) 当我学习obj-C时,我故意泄漏内存。我有更多的知识后,我打算回到自己身后。你的例子对此很有帮助。 – BankStrong 2009-07-20 12:04:48
哇 - 快速和完美。我一直在撕掉我的头发。 – BankStrong 2009-07-17 15:36:02