jjzjj

ios - 在 __NSArrayM objectAtIndex 上崩溃,但我进行了验证

coder 2024-01-17 原文

我遇到了这个崩溃:

Last Exception Backtrace:
0   CoreFoundation                  0x1838551b8 __exceptionPreprocess + 124 (NSException.m:165)
1   libobjc.A.dylib                 0x18228c55c objc_exception_throw + 56 (objc-exception.mm:521)
2   CoreFoundation                  0x18373071c -[__NSArrayM objectAtIndex:] + 228 (NSArray.m:389)
3   living                          0x100c0d89c -[RequestCache sendEvents] + 76
4   libdispatch.dylib               0x1826de1bc _dispatch_client_callout + 16 (object.m:455)
5   libdispatch.dylib               0x1826eaf94 _dispatch_continuation_pop + 576 (inline_internal.h:2424)
6   libdispatch.dylib               0x1826f7634 _dispatch_source_latch_and_call + 204 (source.c:594)
7   libdispatch.dylib               0x1826e0160 _dispatch_source_invoke + 820 (source.c:897)
8   libdispatch.dylib               0x1826e2bbc _dispatch_main_queue_callback_4CF + 572 (inline_internal.h:2461)
9   CoreFoundation                  0x183802810 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12 (CFRunLoop.c:1793)
10  CoreFoundation                  0x1838003fc __CFRunLoopRun + 1660 (CFRunLoop.c:3004)
11  CoreFoundation                  0x18372e2b8 CFRunLoopRunSpecific + 444 (CFRunLoop.c:3113)
12  GraphicsServices                0x1851e2198 GSEventRunModal + 180 (GSEvent.c:2245)
13  UIKit                           0x1897757fc -[UIApplication _run] + 684 (UIApplication.m:2650)
14  UIKit                           0x189770534 UIApplicationMain + 208 (UIApplication.m:4092)
15  living                          0x10065fb2c main + 88 (main.m:15)
16  libdyld.dylib                   0x1827115b8 start + 4

崩溃发生在以下代码中:

NSMutableArray * cachedRequests = [[NSMutableArray alloc] init];

   // ....

- (void) sendEvents {

    if (cachedRequests != nil && [cachedRequests count] == 0){
        return;
    }
    MyCacheData *requestData = [cachedRequests objectAtIndex:0]; // <- Crash happens here

    if (requestData != nil) {
        [cachedRequests removeObject:requestData];
    }    
}

我从不同的地方和不同的线程调用sendEvents,例如:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self sendEvents];
    });

或者来自NSURLSessionDataTask的回调

我是否需要使用 @synchronized (self) {} 锁定所有方法内容?

喜欢:

- (void) sendEvents {
 @synchronized (self) {   
    if (cachedRequests != nil && [cachedRequests count] == 0){
        return;
    }
    MyCacheData *requestData = [cachedRequests objectAtIndex:0]; 

    if (requestData != nil) {
        [cachedRequests removeObject:requestData];
    }  
  }  
}

或者有其他更合适的方法来摆脱这个崩溃?


我从生产版本的 iTunes Connect 中得到了这个异常

[编辑]

当我尝试为 cachedRequests 设置 0 长度并调用 [cachedRequests objectAtIndex:0] 我得到异常:

* Terminating app due to uncaught exception 'NSRangeException', reason: '* -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'

但是从我的崩溃报告中我看到:

-[__NSArrayM objectAtIndex:] + 228 (NSArray.m:389)

两者是一样的还是因为多线程而出现问题?

最佳答案

我认为您的解决方案看起来很合理,这确实是一个并发问题。

根据您类(class)其余部分发生的情况,我将使用 cachedRequests 对象作为同步标记 @synchronized (cachedRequests)。取决于您是否有其他想要与同一把锁同步的东西?

您还需要使用相同的 token 将相同的锁添加到任何其他操作此数组的代码,以同步对它的所有访问。

关于ios - 在 __NSArrayM objectAtIndex 上崩溃,但我进行了验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43386469/

有关ios - 在 __NSArrayM objectAtIndex 上崩溃,但我进行了验证的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  4. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  5. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  6. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  7. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  8. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  9. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  10. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

随机推荐