NSMutableArray正在摧毁我的生命!

时间:2010-03-24 14:36:05

标签: iphone xcode nsmutabledictionary

IET另一个编辑(增加陌生感) 已编辑以显示代码的相关部分

您好。 NSMutableArray有一个奇怪的问题,我只是不理解......

解释

我有一个NSMutableArray,定义为属性(非原子,保留),合成,并用29个元素初始化。

realSectionNames = [[NSMutableArray alloc] initWithCapacity:29];

初始化之后,我可以按照自己的意愿插入元素,一切似乎都正常。

然而,当我运行应用程序时,如果我在数组中插入一个新元素,我可以在插入元素的函数中打印数组,一切似乎都没问题。

但是,当我在表中选择一行时,我需要读取该数组时,我的应用程序崩溃了。事实上,它甚至不能打印阵列。

在使用像我这样的初学者可能会丢失的NSMutableArray时,是否有任何人都应该知道的“魔法和逻辑技巧”?

非常感谢。

我将我的数组声明为

realSectionNames = [[NSMutableArray alloc] initWithCapacity:29];

我使用

在我的数组中插入对象
[realSectionNames addObject:[category categoryFirstLetter]];

虽然我知道我也可以用

插入它
[realSectionNames insertObject:[category categoryFirstLetter] atIndex:i];

其中“i”是第一个非占用位置。

插入后,我重新加载tableView的数据。在重新加载数据之前或之后打印阵列表明它具有所需的信息。

之后,在表中选择一行会导致应用程序崩溃。这个realSectionNames用于几个UITableViewDelegate函数,但对于这种情况并不重要。真正重要的是在didSelectRowAtIndexPath函数的开头打印数组会崩溃一切(当然,不会打印任何东西)。我很确定它是在那条线上,用于在工作之前打印任何线条(例子):

NSLog(@"Anything");
NSLog(@"%@", realSectionNames);

给出输出:

2010-03-24 15:16:04.146 myApplicationExperience [3527:207]一切

[会议开始于2010-03-24 15:16:04 +0000。] GNU gdb 6.3.50-20050815(Apple版gdb-967)(2009年7月14日星期二02:11:58) 版权所有2004 Free Software Foundation,Inc。 GDB是免费软件,由GNU通用公共许可证涵盖,您就是 欢迎在某些条件下更改和/或分发它的副本。 输入“show copying”查看条件。 GDB完全没有保修。输入“show warranty”了解详情。 此GDB配置为“i386-apple-darwin”.sharedlibrary apply-load-rules all 附加到处理3527.

仍然不明白我这次做了什么样的愚蠢...也许现在跟随脑外科医生的职业生涯还为时不晚?

回答后,我打印了

NSLog(@"self=%x", self); 
NSLog(@"self=%@", self); 
NSLog(@"realSectionNames=%x", realSectionNames); 

在每个函数中给出完全相同的结果(来自委托与否)。

NSLog(@"realSections = %@", realSectionNames); 

在我的viewWillAppear中,在didSelectRowAtIndexPath中打印得很好,并在viewForHeaderInSection中崩溃。顺便说一下,没有穿线......

所以,在不知道该做什么的情况下,我正在尝试“事情”......我将所有对realSectionNames的引用都改为self.realSectionNames

在viewForHeaderInSection中打印会出现以下问题:

2010-03-24 16:01:44.067 myApplication[4104:207] numberOfSectionsInTableView result -> 1
2010-03-24 16:01:44.068 myApplication[4104:207] viewForHeaderAtSection
2010-03-24 16:01:44.068 myApplication[4104:207] self=3d13470
2010-03-24 16:01:44.068 myApplication[4104:207] self=<RootViewController: 0x3d13470>
2010-03-24 16:01:44.069 myApplication[4104:207] self.realSectionNames=3b12830
2010-03-24 16:01:44.070 myApplication[4104:207] realSections = (
    <__NSArrayReverseEnumerator: 0x3b50500>
)
2010-03-24 16:01:44.070 myApplication[4104:207] *** -[__NSArrayReverseEnumerator length]: unrecognized selector sent to instance 0x3b50500
2010-03-24 16:01:44.071 myApplication[4104:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayReverseEnumerator length]: unrecognized selector sent to instance 0x3b50500'
2010-03-24 16:01:44.072 myApplication[4104:207] Stack: (
    31073371,
    2572170505,
    31455291,
    31024758,
    30877378,
    276908,
    26404,
    3227182,
    4544033,
    4551926,
    4550923,
    3267462,
    3207973,
    3249408,
    25927,
    3222086,
    3205252,
    459178,
    30857920,
    30854216,
    39163413,
    39163610,
    2949039
)

什么是NSArrayReverseEnumerator ???为什么它对我来说意味着什么?

4 个答案:

答案 0 :(得分:3)

注意每个人(特别是对自己)......

我是一个愚蠢,愚蠢的男孩。

我发布了一个插入数组的元素。

对不起,感谢您的回答......

答案 1 :(得分:1)

当应用程序崩溃时,Xcode控制台将报告导致应用程序崩溃的错误。您需要编辑问题以包含此错误消息以及相关的源代码,因为这将有助于其他人回答您的问题。

我怀疑您选择的表行试图指向数组中的索引,该索引不存在。如果是这样,您试图引用不存在的数组的一部分。这会导致您的应用程序抛出异常并退出。

请记住NSMutableArray可以初始化为某个容量,但在插入项目之前,它实际上并不包含任何对象。 -initWithCapacity:方法仅留出一定数量的内存,但nil1索引没有占位符或n条目。

答案 2 :(得分:0)

1)我们能知道错误信息吗?以及代码的相关部分?

2)以下是声明数组的正确方法:

self.realSectionNames = [[NSMutableArray arrayWithCapacity:29];

答案 3 :(得分:0)

我怀疑你的TableView的委托没有正确连接,或者连接到无效的对象。您的其他任何委托方法是否有效?尝试将这些放在didSelectRowAtIndexPath的顶部以检查指针值:

NSLog(@"self=%x", self);
NSLog(@"self=%@", self);
NSLog(@"realSectionNames=%x", realSectionNames);