菜鸟教程小白 发表于 2022-12-13 16:25:09

ios - 致命异常 : NSRangeException - index 2 beyond bounds [0 .。 1]


                                            <p><p>在我在 swift 项目中使用的一个库中,一行导致应用程序崩溃。我试图理解并修复它,但没有运气。我知道这是由数组索引错误引起的。有人可以帮忙吗?</p>

<p>崩溃报告</p>

<pre><code>Fatal Exception: NSRangeException
0CoreFoundation               0x180a42e38 __exceptionPreprocess
1libobjc.A.dylib                0x1800a7f80 objc_exception_throw
2CoreFoundation               0x180922ebc -
3                        0x10000ac70 - (ChatSectionManager.m:435)
4                        0x10001c194 - (Chat.m:596)
5UIKit                        0x185ee2f40 -
6UIKit                        0x185ee30a8 -
</code></pre>

<p><strong>ChatSectionManager.m</strong> </p>

<pre><code> - (QBChatMessage *)messageForIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.item == NSNotFound) {
      return nil;
    }

    QMChatSection *currentSection = self.chatSections;
    //crashes here line 435
    return currentSection.messages;
}
</code></pre>

<p><strong>Chat.m</strong></p>

<pre><code>- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return ;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return self.chatSectionManager.chatSectionsCount;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) indexPath {

    QBChatMessage *messageItem = ;
</code></pre>

<p>... <strong>方法包含</strong> <code>removeObjectAtIndex</code></p>

<pre><code>- (void)deleteMessages:(NSArray *)messages animated:(BOOL)animated {

    dispatch_async(_serialQueue, ^{

      NSMutableArray *messagesIDs = ;
      NSMutableArray *itemsIndexPaths = ;
      NSMutableIndexSet *sectionsIndexSet = ;

      self.editableSections = self.chatSections.mutableCopy;

      for (QBChatMessage *message in messages) {
            NSIndexPath *indexPath = ;
            if (indexPath == nil) continue;

            QMChatSection *chatSection = self.chatSections;
            ;

            if (chatSection.isEmpty) {
                ;
                ;

                // no need to remove elements whose section will be removed
                NSArray *items = ;
                for (NSIndexPath *index in items) {
                  if (index.section == indexPath.section) {
                        ;
                  }
                }
            } else {

                ;
            }
      }

      dispatch_sync(dispatch_get_main_queue(), ^{

            self.chatSections = self.editableSections.copy;
            self.editableSections = nil;

            if () {

                ;
            }
      });
    });
}
</code></pre>

<p><strong>注意</strong>:这个崩溃是随机发生的,我不知道为什么</p>

<p><strong>织物崩溃报告</strong>
<a href="http://crashes.to/s/679e90f0c90" rel="noreferrer noopener nofollow">http://crashes.to/s/679e90f0c90</a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这绝对是<code>deleteMessages</code>的问题,看看你的线程16在哪里崩溃了:</p>

<blockquote>
<p>QMChatSectionManager.m line 228
__48-_block_invoke</p>
</blockquote>

<p>检查第 228 行到底是哪一行以确定问题所在,但我会在这里冒险并猜测它是什么</p>

<pre><code>;
</code></pre>

<p>所以你要在线程 16 上删除 <code>messageForIndexPath</code> 在主线程上引用的数据结构。正如您所注意到的,这是对几乎不可能按需复制的竞争条件的公开邀请。</p>

<p>解决方法是不要在后台线程中修改 <code>chatSection</code> 的内容。看起来您已经有了正确的想法,在主线程上分配已完成的部分列表,</p>

<pre><code>self.chatSections = self.editableSections.copy;
</code></pre>

<p>只需将该逻辑应用于部分列表中更改的每个项目,您的随机崩溃就会消失。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 致命异常 : NSRangeException - index 2 beyond bounds ,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37150746/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37150746/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 致命异常 : NSRangeException - index 2 beyond bounds [0 .。 1]