2014-03-25 233 views
1

我无法重现有时发生的一些错误。这是一个报告:一些objc_release崩溃。什么可能是一个原因?

Exception Type: EXC_CRASH (SIGSEGV) 
Exception Codes: 0x0000000000000000, 0x0000000000000000 
Triggered by Thread: 1 

Thread 0: 
0 libobjc.A.dylib     0x3b4b97fa objc_release + 10 
1 MyApp       0x00173610 -[AFHTTPRequestOperation error] (AFHTTPRequestOperation.m:136) 
2 MyApp       0x001460ea -[RKObjectRequestOperationLogger HTTPOperationDidFinish:] (RKObjectRequestOperation.m:209) 
3 CoreFoundation     0x31121e6e __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 10 
4 CoreFoundation     0x31095aac _CFXNotificationPost + 1716 
5 Foundation      0x31a7bec0 -[NSNotificationCenter postNotificationName:object:userInfo:] + 68 
6 Foundation      0x31a807c2 -[NSNotificationCenter postNotificationName:object:] + 26 
7 MyApp       0x0017e44e __34-[AFURLConnectionOperation finish]_block_invoke (AFURLConnectionOperation.m:558) 
8 libdispatch.dylib    0x3b9a10c0 _dispatch_call_block_and_release + 8 
9 libdispatch.dylib    0x3b9a10ac _dispatch_client_callout + 20 
10 libdispatch.dylib    0x3b9a39a4 _dispatch_main_queue_callback_4CF + 264 
11 CoreFoundation     0x3112a5ac __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 4 
12 CoreFoundation     0x31128e78 __CFRunLoopRun + 1304 
13 CoreFoundation     0x3109346c CFRunLoopRunSpecific + 520 
14 CoreFoundation     0x3109324e CFRunLoopRunInMode + 102 
15 GraphicsServices    0x35dcd2e6 GSEventRunModal + 134 
16 UIKit       0x33948840 UIApplicationMain + 1132 
17 MyApp       0x00014d54 main (main.m:16) 
18 libdyld.dylib     0x3b9b5ab4 start + 0 

Thread 1 Crashed: 
0 libsystem_kernel.dylib   0x3ba59838 kevent64 + 24 
1 libdispatch.dylib    0x3b9a80d0 _dispatch_mgr_invoke + 228 
2 libdispatch.dylib    0x3b9a261e _dispatch_mgr_thread + 34 

什么我可以从这样的记录了解?谁可以成为罪魁祸首? AFHTTPRequestOperation.m:136没有长相,可导致崩溃

135: - (NSError *)error { 
136:  if (!self.HTTPError && self.response) { 
137:   if (![self hasAcceptableStatusCode] || ![self hasAcceptableContentType]) { 
从那里objc_release能来

呢? objc_release是否意味着ARC试图从内存中释放某些东西?在什么时候(代码中)可以发生?

提供AFURLConnectionOperation.m的代码:使用与块的weakSelf码图案

- (void)finish { 
     self.state = AFOperationFinishedState; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
558:   [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingOperationDidFinishNotification object:self]; 
     }); 
    } 
+0

您应该将代码发布到此处调用的代码块: __34- [AFURLConnectionOperation finish] _block_invoke(AFURLConnectionOperation.m:558) ...块会导致保留块中引用的对象。 – stevesliva

+0

我已添加。 dispatch_async(dispatch_get_main_queue(),^ {[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingOperationDidFinishNotification object:self]; }); – adsurbum

回答

1

尝试。希望这个区块内的弱点而不是强烈的参照将会避免释放。

看到这里的答案: What is the proper way to avoid Retain Cycle while using blocks

其实我喜欢的异步第二个最流行的答案。我真的很喜欢它,因为你有这种方法称为“完成” - 如果你碰巧让自己与被执行的块同时离开,也许你会得到这个错误。

希望能为你工作。

+0

使用'weakSelf'模式肯定无助于避免发布。 – Kamchatka

+0

@Kamchatka - 这里的堆栈跟踪释放是块本身的释放。当这个街区被释放时,会有一个街区故障。我绝对相信,如果该块的异步调用导致seg故障,避免由名为'finish'的实例方法中创建的块保留'self'非常重要。可能在我的回答中不明确,但是关于什么是被避免的。或许,在块被执行之前找出他在自己身上践踏的地方会更好。 – stevesliva

+0

使其变弱会使'post对象':'post'具有'nil'作为'object'参数。你需要在该块中强调“自我”,所以做弱自我/强自己的舞蹈。顺便说一句,你怎么看到这个版本是块的释放? – Kamchatka

相关问题