NSMutableArray正在破坏我的生活!
IET另一编辑(增加奇怪) 编辑显示相关部分的代码NSMutableArray正在破坏我的生活!
嗨。有有一个NSMutableArray一个奇怪的问题,我只是不理解......
解释:
我有一个NSMutableArray的,定义为一个属性(非原子,保留),合成,并与29个元素初始化。
realSectionNames = [[NSMutableArray alloc] initWithCapacity:29];
初始化后,我可以插入元素,因为我希望和一切似乎工作正常。然而,当我运行应用程序时,如果我在数组中插入一个新元素,我可以在插入元素的函数中打印该数组,并且一切似乎都正常。
但是,当我在表中选择一行并需要读取该数组时,我的应用程序崩溃。事实上,它甚至无法打印阵列。
当使用像我这样的初学者可能会丢失的NSMutableArray时,每个人都应该知道是否有任何“魔法和逻辑技巧”?
非常感谢。
我宣布我的数组作为
realSectionNames = [[NSMutableArray alloc] initWithCapacity:29];
我插在我的数组对象与
[realSectionNames addObject:[category categoryFirstLetter]];
虽然我知道我还可以
插入其中“我“是第一个非占领的位置。
插入后,我重新加载我的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(苹果版GDB-967)(星期二7月14日02:11: 58 UTC 2009) 版权所有2004*软件基金会,Inc. GDB是免费软件,由GNU Ge neral公共许可证,你是 欢迎在特定条件下更改和/或分发它的副本。 输入“show copying”查看条件。 GDB绝对没有保修。请输入“显示保修”以了解详情。 这GDB被配置为“I386的苹果达尔文” .sharedlibrary应用负载规则所有附加 处理3527
还没了解什么样的愚蠢的我做了这个时候...也许这不是来不及追随脑外科医生的职业?
以下一个答案,我印刷
NSLog(@"self=%x", self);
NSLog(@"self=%@", self);
NSLog(@"realSectionNames=%x", realSectionNames);
给出每个功能完全相同的结果(从代表或没有)。
NSLog(@"realSections = %@", realSectionNames);
版画以及在我的viewWillAppear中,在didSelectRowAtIndexPath方法,和崩溃的viewForHeaderInSection。没有穿线,顺便......
所以,不知道该怎么办,我想“的事情” ......我改self.realSectionNames 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?为什么它对我意味着?
当应用程序崩溃时,Xcode控制台将报告导致应用程序崩溃的错误。您需要编辑您的问题以包含此错误消息以及相关的源代码,因为这有助于他人回答您的问题。
我怀疑你所选择的表行试图指向数组中的索引,该索引不存在。如果是这样,你试图引用不存在的数组的一部分。这会导致您的应用程序抛出异常并退出。
请记住,NSMutableArray
可以初始化为某个容量,但是直到插入项目为止,它实际上并不包含任何对象。 -initWithCapacity:
方法仅预留了一定量的内存,但是没有占位符或到n
索引的nil
条目。
1)我们能否知道错误信息?和代码的相关部分?
2)这里是来声明数组的正确方法:
self.realSectionNames = [[NSMutableArray arrayWithCapacity:29];
使用alloc和init创建一个NSMutableArray没什么问题,尤其是当你需要在autorelease池耗尽时需要保留它。 – 2010-03-24 15:28:21
那么为什么综合它,如果你不使用setter? – chacha 2010-03-24 15:37:35
我怀疑你的TableView的委托不挂钩正确,或连接到一个无效的对象。你的其他委托方法是否有效?尝试把这些在didSelectRowAtIndexPath方法顶部检查指针值:
NSLog(@"self=%x", self);
NSLog(@"self=%@", self);
NSLog(@"realSectionNames=%x", realSectionNames);
NSLog(@“self =%x”,self); NSLog(@“self =%@”,self); NSLog(@“realSectionNames =%x”,realSectionNames);在任何地方给出完全相同的结果NSLog(@“realSections =%@”,realSectionNames);在我的viewWillAppear中,在didSelectRowAtIndexPath中打印并在viewForHeaderInSection中崩溃。 – camilo 2010-03-24 15:56:32
注意事项给大家(和特制自己)......
我是个哑巴,哑巴男孩。
我发布了一个插入数组的元素。
对不起,若要回答问题,谢谢你的回答...
任何机会看到崩溃的代码?很难猜测问题是什么...... – Vladimir 2010-03-24 14:37:50