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 ???为什么它对我来说意味着什么?
答案 0 :(得分:3)
注意每个人(特别是对自己)......
我是一个愚蠢,愚蠢的男孩。
我发布了一个插入数组的元素。
对不起,感谢您的回答......
答案 1 :(得分:1)
当应用程序崩溃时,Xcode控制台将报告导致应用程序崩溃的错误。您需要编辑问题以包含此错误消息以及相关的源代码,因为这将有助于其他人回答您的问题。
我怀疑您选择的表行试图指向数组中的索引,该索引不存在。如果是这样,您试图引用不存在的数组的一部分。这会导致您的应用程序抛出异常并退出。
请记住NSMutableArray
可以初始化为某个容量,但在插入项目之前,它实际上并不包含任何对象。 -initWithCapacity:
方法仅留出一定数量的内存,但nil
到1
索引没有占位符或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);