簡體   English   中英

使用EXC_BAD_ACCESS的Objective-C回調函數錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM