2014-12-29 73 views
1

回調函數的錯誤,我有以下回調函數:的Objective-C與EXC_BAD_ACCESS

void(^getImageCallback)(BOOL success, UIImage *image , NSError *error); 

- (void)getRemoteImageWithObjectId:(NSString *)objectId andType:(NSString *)type andSaveLocal:(BOOL)saveLocal withCallback:(GAGetImageCompletionBlock)callback{ 
    getImageCallback = callback; 

    [self getRemoteImageWithObjectId:objectId andType:type shouldSaveLocal:saveLocal]; 

} 

- (void)getRemoteImageWithObjectId:(NSString *)objectId andType:(NSString *)type shouldSaveLocal:(BOOL)saveLocal{ 

    UIImage *image = [UIImage imageNamed:@"running.png"]; 
    getImageCallback(YES, image, nil); //it errors out here 
} 

我的應用程序崩潰在這裏與錯誤:Thread 1: EXC_BAD_ACCESS (code=1, address=0x10)

有誰知道爲什麼會發生?

+0

請說明您是如何聲明「getImageCallback」的。 – gagarwal

+0

EXC_BAD_ACCESS信號是將無效指針傳遞給系統調用的結果,因此您可能會在某處取消引用空指針。 –

+0

需要更多信息才能幫助您。你在使用MRC還是ARC?在這一點上它錯誤了'getImageCallback'的價值?如果它是'nil',在'getImageCallback = callback'中賦給它的'callback'的值是多少? – CRD

回答

0

您可能會調用第二個getRemoteImageWithObjectId方法而不是第一個getRemoteImageWithObjectId方法。所以getImageCallback變量當時爲零。 EXC_BAD_ACCESS (code=1, address=0x10)的原因可能是調用nil getImageCallback塊。

例如,如果您在64位環境下編譯並執行以下Objective-C代碼,則得到的地址= 0x10的EXC_BAD_ACCESS完全相同。

void (^block)() = 0; 
block(); 

您可以使用叮鐺聲-rewrite-objc選項在C++中仔細檢查此代碼。這個Objective-C代碼被編譯爲以下C++代碼。

struct __block_impl { 
    void *isa;  // offset:0x00 
    int Flags;  // offset:0x08 
    int Reserved; // offset:0x0c 
    void *FuncPtr; // offset:0x10 
}; 

void (*block)() = 0; 
((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block); 

現在block變量爲0(零),所以block->FuncPtr點地址0x10。因此發生EXC_BAD_ACCESS (code=1, address=0x10)

LLVM文件說同樣的事情。 http://clang.llvm.org/docs/Block-ABI-Apple.html#high-level

struct Block_literal_1 { 
    void *isa; // initialized to &_NSConcreteStackBlock or &_NSConcreteGlobalBlock 
    int flags; 
    int reserved; 
    void (*invoke)(void *, ...);