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