【问题标题】:NSMutableArray addObject not workingNSMutableArray addObject 不起作用
【发布时间】:2010-12-22 01:46:44
【问题描述】:

我在我的视图控制器.h 文件中声明了一个NSMutableArray *categories,并为它声明了一个属性。

在我的 .m 文件中 NSXMLParser 委托的 parser:foundCharacters: 方法中,我有以下代码:

-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string  
{  
    if (elementFound)  
    {  
        element = string;  
        [self.categories addObject:element];  
    }  
}

但是当我在调试模式下进入[self.categories addObject:element] 行后,XCode 告诉我大小为 0x0, 0 个对象。我的 XML 文件中有 3 个元素,因此数组中应该有 3 个元素。

我遗漏了一些非常明显的东西,我不知道是什么。

【问题讨论】:

  • 为了您以后的发帖:格式化代码的方法是选择代码块,然后使用帖子编辑器顶部的“代码”格式化程序按钮将所有内容缩进4个空格。
  • 对不起 - 我从另一个论坛复制和粘贴,猜格式不支持太多!谢谢

标签: objective-c nsmutablearray


【解决方案1】:

使用

初始化一个空数组
categories = [NSMutableArray array];

数组类方法是自动释放的,不需要释放。

【讨论】:

  • Vishu - 您的解决方案有效,但我认为 Joshua Nozzi 的解决方案更好,因为它需要更少的内存。
  • 这在功能上等同于我五年半前的回答,只是使用便捷方法而不是 alloc/init。内存使用没有区别,结果完全一样。
  • @JoshuaNozzi 数组类方法本身会产生一个自动释放的数组,这意味着您不必(也不应该)手动释放它。
  • 我知道这一点。我的观点是,您在六年后添加了一个功能等效的答案,而在手动引用计数不再是由于 ARC 而开始的问题之后。为什么不回答一个尚未回答的问题,或者回答一个明显更好的答案?
【解决方案2】:

“0x0”部分是内存地址。具体来说,“nil”,这意味着您的可变数组在被调用时不存在。尝试在您的 -init 方法中创建它:

categories = [[NSMutableArray alloc] init];

别忘了在你的 -dealloc 中释放它。

【讨论】:

  • 我不知道为什么我总是忘记这样做。谢谢。
  • (2012 更新:如果您使用 ARC,则可以忽略 release/dealloc 部分。)
  • 谢谢!很容易忘记在 Objective-C 中传递给 nil 对象引用的消息不会失败。
  • 来自 Swift,我总是忘记new NSMutable 数组:) 在 Swift 中,我们通常在声明数组时初始化数组或给它一个可选标记。在 Objective-C 中,显然它的工作方式有所不同。并且编译器不会在 OC 中警告你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多