2

時々発生するバグを再現できません。これはレポートです:

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 のコードを提供:

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

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

1 に答える 1

2

ブロックで weakSelf コード パターンを使用してみてください。ブロック内の強い参照ではなく弱い参照は、うまくいけばリリースを回避します。

ここで回答を参照してください: ブロックを使用しているときに保持サイクルを回避する適切な方法は何ですか

私は実際、非同期に対する 2 番目に人気のある回答が気に入っています。「finish」と呼ばれるこのメソッドがあるので、私は本当にそれが好きです。実行中のブロックと同時に self を削除すると、おそらくこのエラーが発生します。

それがうまくいくことを願っています。

于 2014-03-25T17:54:16.660 に答える