使用块会导致EXC_BAD_ACCESS

时间:2011-07-26 15:22:15

标签: objective-c ios exc-bad-access objective-c-blocks

我想使用块,但在几次调用后它会导致我EXC_BAD_ACCESS。

我的代码:

- (void) sendBasket {
    if (currentSendToBasketBlock != nil) {
    // there's already a webservice going... set the new one as waiting
    waitingSendToBasketBlock = ^ {
        WebServicesModel *webServicesModel = [[[WebServicesModel alloc] init] autorelease];
        webServicesModel.delegate = self;
        [webServicesModel sendBasketToServer:currentBasket];

        [self showBasketBackground];

    };
    [waitingSendToBasketBlock copy];
} else {
    currentSendToBasketBlock = ^ {
        WebServicesModel *webServicesModel = [[[WebServicesModel alloc] init] autorelease];
        webServicesModel.delegate = self;
        [webServicesModel sendBasketToServer:currentBasket];

        [self showBasketBackground];
    };

    [currentSendToBasketBlock copy];

    currentSendToBasketBlock();
}
}

当webservice完成时,它会在同一个对象上调用特定的方法:

- (void) specificMethod {
    if (waitingSendToBasketBlock != nil) {
        waitingSendToBasketBlock(); // here, the EXC_BAD_ACCESS happens
        waitingSendToBasketBlock = nil;
    }
}

我错过了什么?乐器没有找到僵尸......

谢谢!

编辑:崩溃日志

Thread 0 name:  Dispatch queue: com.apple.libdispatch-manager
Thread 0:
0   libsystem_kernel.dylib          0x35590fbc kevent + 24
1   libdispatch.dylib               0x3525bed4 _dispatch_mgr_invoke + 744
2   libdispatch.dylib               0x3525cf3a _dispatch_queue_invoke + 70
3   libdispatch.dylib               0x3525c4ec _dispatch_worker_thread2 + 228
4   libsystem_c.dylib               0x3566758a _pthread_wqthread + 258
5   libsystem_c.dylib               0x35667bbc start_wqthread + 0

Thread 1 name:  WebThread
Thread 1:
0   libsystem_kernel.dylib          0x3558dc00 mach_msg_trap + 20
1   libsystem_kernel.dylib          0x3558d758 mach_msg + 44
2   CoreFoundation                  0x309582b8 __CFRunLoopServiceMachPort + 88
3   CoreFoundation                  0x3095a562 __CFRunLoopRun + 350
4   CoreFoundation                  0x308eaebc CFRunLoopRunSpecific + 224
5   CoreFoundation                  0x308eadc4 CFRunLoopRunInMode + 52
6   WebCore                         0x35f5327e _ZL12RunWebThreadPv + 382
7   libsystem_c.dylib               0x3566630a _pthread_start + 242
8   libsystem_c.dylib               0x35667bb4 thread_start + 0

Thread 2:
0   libsystem_kernel.dylib          0x35591cb0 stat + 12
1   CFNetwork                       0x34cccf56 DiskCookieStorage::syncStorageLocked() + 422
2   CFNetwork                       0x34c3fa60 PrivateHTTPCookieStorage::syncStorage() + 20
3   CFNetwork                       0x34ccaa7e HTTPCookieStorage::syncStorage() + 6
4   CFNetwork                       0x34ccaa9c HTTPCookieStorage::_syncTimerFired(__CFRunLoopTimer*, void*) + 12
5   CoreFoundation                  0x30957a40 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 8
6   CoreFoundation                  0x30959ec4 __CFRunLoopDoTimer + 844
7   CoreFoundation                  0x3095a83e __CFRunLoopRun + 1082
8   CoreFoundation                  0x308eaebc CFRunLoopRunSpecific + 224
9   CoreFoundation                  0x308eadc4 CFRunLoopRunInMode + 52
10  Foundation                      0x341dd7f6 +[NSURLConnection(NSURLConnectionReallyInternal) _resourceLoadLoop:] + 206
11  Foundation                      0x341d0382 -[NSThread main] + 38
12  Foundation                      0x342425c6 __NSThread__main__ + 966
13  libsystem_c.dylib               0x3566630a _pthread_start + 242
14  libsystem_c.dylib               0x35667bb4 thread_start + 0

Thread 3 name:  com.apple.CFSocket.private
Thread 3:
0   libsystem_kernel.dylib          0x3558fc60 __select + 20
1   CoreFoundation                  0x3095d8f2 __CFSocketManager + 582
2   libsystem_c.dylib               0x3566630a _pthread_start + 242
3   libsystem_c.dylib               0x35667bb4 thread_start + 0

Thread 4:
0   libsystem_kernel.dylib          0x3558dc00 mach_msg_trap + 20
1   libsystem_kernel.dylib          0x3558d758 mach_msg + 44
2   CoreFoundation                  0x309582b8 __CFRunLoopServiceMachPort + 88
3   CoreFoundation                  0x3095a562 __CFRunLoopRun + 350
4   CoreFoundation                  0x308eaebc CFRunLoopRunSpecific + 224
5   CoreFoundation                  0x3092d6d2 CFRunLoopRun + 42
6   MyProject                       0x0011c41a +[ASIHTTPRequest runRequests] (ASIHTTPRequest.m:4773)
7   Foundation                      0x341d0382 -[NSThread main] + 38
8   Foundation                      0x342425c6 __NSThread__main__ + 966
9   libsystem_c.dylib               0x3566630a _pthread_start + 242
10  libsystem_c.dylib               0x35667bb4 thread_start + 0

Thread 5:
0   libsystem_kernel.dylib          0x355903ec __workq_kernreturn + 8
1   libsystem_c.dylib               0x356676d8 _pthread_wqthread + 592
2   libsystem_c.dylib               0x35667bbc start_wqthread + 0

Thread 6:
0   libsystem_kernel.dylib          0x355903ec __workq_kernreturn + 8
1   libsystem_c.dylib               0x356676d8 _pthread_wqthread + 592
2   libsystem_c.dylib               0x35667bbc start_wqthread + 0

Thread 7:
0   libsystem_kernel.dylib          0x355903ec __workq_kernreturn + 8
1   libsystem_c.dylib               0x356676d8 _pthread_wqthread + 592
2   libsystem_c.dylib               0x35667bbc start_wqthread + 0

1 个答案:

答案 0 :(得分:6)

您没有对副本执行任何操作,因此您仍在尝试访问存储在堆栈中的块。请拨打copy

的电话号码
waitingSendToBasketBlock = Block_copy(waitingSendToBasketBlock);
//and
currentSendToBasketBlock = Block_copy(currentSendToBasketBlock);