insertObject 不添加对象?

Posted

技术标签:

【中文标题】insertObject 不添加对象?【英文标题】:insertObject doesn't add object? 【发布时间】:2009-07-17 15:29:00 【问题描述】:

我正在尝试通过 Obj-C 摸索构建 iPhone 游戏。

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

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

insertObject 行将计数保留为 0。但是,下一行正确插入对象(并且计数移至 1)。什么给了?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

@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 的更正代码的情况下,这是发生了什么,按行:

    分配了NSMutableArray 的新实例;调用 -init 方法,初始化实例并将保留计数设置为 1。然后将 positionIcons 指针设置为这个新实例的地址。 -insertObject:atIndex: 方法在 positionIcons 上调用,一切正常(此外,按照惯例,将对象添加到像 NSMutableArray 这样的集合会增加该对象的保留计数,这个想法是集合现在具有从某种意义上说,该对象的“所有权”,并且不希望它从其下方被释放)。 分配了NSArray 的新实例,然后将positionIcons 指针设置为该新实例的地址。 因为第一行中NSMutableArray 的保留计数仍为1,它不会被释放,并且由于您丢失了对它的引用,因此您永远不能在其上调用-release 以将其从内存中清除。有你的漏洞。

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

【讨论】:

谢谢 - 内存泄漏问题出现在我的代码中(我确信 msaeed 不想通过同时修复来混淆)。当我学习 obj-C 时,我故意泄漏内存。我打算在我有更多的知识来扫除自己之后再回去。您的示例非常适合。 这不好玩/:自 2008 年以来我学到了很多东西,现在我终于开始制作 MASSIVE 项目,我的应用程序崩溃了,我不得不回去学习所有这些东西! !!内存啊啊啊

以上是关于insertObject 不添加对象?的主要内容,如果未能解决你的问题,请参考以下文章

与 insertObject:atIndex 崩溃:对象不能为 nil 但没有数组

NSArrayM insertObject:atIndex:]: 对象不能为 nil

[__NSArrayM insertObject:atIndex:]:对象不能为 nil' - 图片

表视图崩溃与'*** - [__NSArrayM insertObject:atIndex:]:对象不能为零'

NSFetchedResultsController -[__NSArrayM insertObject:atIndex:]:对象不能为 nil

Facebook JSON 提要 - __NSArrayM insertObject:atIndex:]:对象不能为 nil