NSMutableArray addObject不起作用

59
我在我的视图控制器的.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个项。

我错过了某些非常明显的东西,但我想不出来是什么。


3
以后发布帖子时,请使用“代码”格式化按钮,选中代码块并将所有内容缩进4个空格。这样可以使代码更易于阅读。 - Jonathan Feinberg
抱歉 - 我从另一个论坛复制并粘贴了这段内容,猜测格式可能没有保持好!谢谢。 - joec
2个回答

150

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

categories = [[NSMutableArray alloc] init];

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


12
我不知道为什么我总是忘记做这件事。谢谢。 - James
17
2012更新:如果您使用ARC,则可以忽略释放/销毁部分。 - Joshua Nozzi
4
谢谢!很容易忘记在Objective-C中发送给空对象的引用的消息不会失败。 - JasonD
来自Swift,我总是忘记使用new关键字创建NSMutable数组 :) 在Swift中,我们通常在声明时初始化数组或给它一个可选标记。而在Objective-C中,显然工作方式不同。并且编译器不会在OC中警告你。 - Zhou Haibo

8

使用以下方法初始化一个空数组:

categories = [NSMutableArray array];

数组类方法是自动释放的,因此不需要进行释放操作。

Vishu - 你的解决方案是有效的,但我认为Joshua Nozzi的解决方案更好,因为它需要更少的内存。 - Itai Spector
1
这在功能上等同于我五年半前的答案,只是使用了方便的方法而不是alloc/init。内存使用没有任何区别,结果完全相同。 - Joshua Nozzi
@JoshuaNozzi 数组类方法本身会生成一个自动释放的数组,这意味着您不需要(也不应该)手动释放它。 - iamVishal16
我知道这一点。我的观点是,你在六年后添加了一个功能等效的答案,而手动引用计数已经不再是一个问题,因为有了ARC。为什么不回答一个还没有被回答过的问题或者回答一个具有可证明更好答案的问题呢? - Joshua Nozzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接