0

IET ANOTHER EDIT(增加陌生感) EDITED 显示代码的相关部分

你好。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 UTC)版权所有 2004 自由软件基金会, Inc. GDB 是自由软件,受 GNU 通用公共许可证保护,欢迎您在特定条件下更改和/或分发它的副本。键入“显示复制”以查看条件。GDB 绝对没有任何保证。键入“显示保修”以获取详细信息。此 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

4 回答 4

3

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

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

我正在释放一个插入到数组中的元素。

不好意思提问,谢谢解答。。。

于 2010-03-24T16:46:28.307 回答
1

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

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

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

于 2010-03-24T14:44:25.367 回答
0

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

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

self.realSectionNames = [[NSMutableArray arrayWithCapacity:29];
于 2010-03-24T14:44:51.390 回答
0

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

NSLog(@"self=%x", self);
NSLog(@"self=%@", self);
NSLog(@"realSectionNames=%x", realSectionNames);
于 2010-03-24T15:27:33.460 回答