- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到了这个崩溃:
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/
救命!我已经为这个问题苦恼了 1 个小时了。 我正在我的 .h 文件中创建一个数组 @interface LeftMenuViewController : UIViewController
我想使用 NSMutableArray 中的 ValueForKey 替换 objectAtIndex。我已经尝试了下面的代码,但是没有用,它崩溃了, [[students valueForKey:@
我有一个包含 10 个对象的 Array。我将第一个对象放入带有 String 的 Label 中。 然后我想要一个将 objectAtIndex 增加 1 的方法。 这是我的代码: //.m @in
我有 NSMutableArray “Tag”,其对象位于索引 0 上:“data”、“data1”、“data2”,索引 1:“data3”,索引 2:“data2” ...我选择的标签是“data
嗨,我有一个数组数组,我在添加某个索引后删除了一个对象。不知何故,我认为这表现得很奇怪,或者我可能忽略了一些事情。这是代码。我用 nslogs 对其进行跟踪。 for (int i = 0;
在我的 UIScrollView 中,我的数组中有 30 张图像。我尝试在数组中获取 objectAtIndex。我希望能够在 UIScrollView 停止滚动时在特定图像中显示动画。所以我在下面尝
如何在我的方法中获取 objectAtIndex。 例如,如果我使用 didSelectRowAtIndexPath:(NSIndexPath *)indexPath 我可以得到它 NSLog(@"
我正在尝试掌握 Objective C 和 Cocoa,所以我可能在这里使用了错误的术语。 我为一副纸牌创建了一个 Objective C 类,由我的主 AppDelegate.h 和 AppDele
我在使用 NSFetchedResultsController objectAtIndex 时出现内存泄漏:栈帧如下: 0 CoreFoundation __CFDataAllocate
我正在开发iOS应用程序。值存储在Array上,但是当我运行应用程序时,它崩溃,数组索引超出范围。请先帮助并谢谢。 代码: daysOfWeek = [NSArray arrayWithObjects
我有一个我想要一个值的 NSArray。 _membersArray = [_detailItem valueForKey:@"members"]; 当我使用此代码时: NSLog(@"%lu", (
我有一个 UITableView,它由从 XML 提要解析的数据数组填充。我正在努力寻找此错误的原因,并想知道是否有人可以帮助我。该错误不会经常发生。它仅在数组数量很大时发生,例如 10-15 个对象
我收到上述错误,但不知道为什么,因为我在另一个示例中实现了相同的代码。 “服务”是我的 NSMutableArray,“服务名称”是带有标签 2 的 TableView 上的标签。在 viewdidl
初学者 iOS 开发问题在这里。 我有以下格式的 plist: 我在我的应用程序中使用以下方法将这个 plist 转换为一个数组: NSMutableArray *array2 = [[NSMutab
我正在构建一个简单的 Swift CoreData TableView 应用程序。我已成功将数据保存到数据库并在 TableView 中重新加载数据。接下来我要做的是编辑这些数据。通过点击表格单元格/
所以我在这里有函数 collectionView: cellForItemAtIndexPath: func collectionView(collectionView: UICollectionVi
NSInteger *count = [monLessonArrayA count]; 对于 (i = 0; i < count; i++) { arrayVar = [monLessonArrayA
2012-06-15 17:53:25.532 BadgerNew[3090:707] *** Terminating app due to uncaught exception 'NSRangeEx
这个问题在这里已经有了答案: 关闭 9 年前。 Possible Duplicate: Is there some literal dictionary or array syntax in Obj
我有一个 NSArray,其中包含索引 0 - 9 的 10 个对象。数组中的每个条目都是一个引号。 当我的用户选择“随机引用”选项时,我希望能够从数组中选择一个随机条目并显示该条目中包含的文本。 有
我是一名优秀的程序员,十分优秀!