[英]objective-c callback function errors with 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)
有誰知道為什么會這樣?
您可以調用第二個getRemoteImageWithObjectId
方法,而不是第一個getRemoteImageWithObjectId
方法。 因此,那時的getImageCallback
變量為nil。 EXC_BAD_ACCESS (code=1, address=0x10)
可能是調用nil getImageCallback
塊。
例如,如果在64位環境上編譯並執行以下Objective-C代碼,則將獲得地址= 0x10的完全相同的EXC_BAD_ACCESS。
void (^block)() = 0;
block();
您可以使用clang -rewrite-objc
選項在C ++中-rewrite-objc
檢查此代碼。 該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(nil),因此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 *, ...);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.