2010-03-24 117 views
0

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?为什么它对我意味着?

+2

任何机会看到崩溃的代码?很难猜测问题是什么...... – Vladimir 2010-03-24 14:37:50

回答

1

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

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

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

0

1)我们能否知道错误信息?和代码的相关部分?

2)这里是来声明数组的正确方法:

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

使用alloc和init创建一个NSMutableArray没什么问题,尤其是当你需要在autorelease池耗尽时需要保留它。 – 2010-03-24 15:28:21

+1

那么为什么综合它,如果你不使用setter? – chacha 2010-03-24 15:37:35

0

我怀疑你的TableView的委托不挂钩正确,或连接到一个无效的对象。你的其他委托方法是否有效?尝试把这些在didSelectRowAtIndexPath方法顶部检查指针值:

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

NSLog(@“self =%x”,self); NSLog(@“self =%@”,self); NSLog(@“realSectionNames =%x”,realSectionNames);在任何地方给出完全相同的结果NSLog(@“realSections =%@”,realSectionNames);在我的viewWillAppear中,在didSelectRowAtIndexPath中打印并在viewForHeaderInSection中崩溃。 – camilo 2010-03-24 15:56:32

3

注意事项给大家(和特制自己)......

我是个哑巴,哑巴男孩。

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

对不起,若要回答问题,谢谢你的回答...