64bit(arm64)対応の際の動的メソッドの呼び出し
64bit化に対応する際にちょっとハマったので調べてみたら、動的にメソッドを呼ぶ際の呼び出し方に対応が必要そうだった。
もともとのソースは。
Method method = class_getInstanceMethod([self->object class], self->selector); IMP callback = method_getImplementation(method); callback(self->object, self->selector, [[NSNumber alloc] initWithInt:1]);
もしくは
objc_msgSend(self->object, self->selector, [[NSNumber alloc] initWithInt:1])
こんなコードはパラメータで渡したオブジェクトがうまく渡らずEXEC_BAD_ACCESSで落ちてしまった。
それを
((void(*)(id, SEL, id))objc_msgSend)(self->object, self->success, [[NSNumber alloc] initWithInt:1]);
このように変えたらうまく動いた。
あと、「Implicitly declaring library function ‘objc_msgSend’ with type ‘id (id, SEL, …)’」というワーニングが出てたけど
#import <objc/runtime.h>
としているところを
#import <objc/message.h>
と変えたらワーニングも消えた。
参考)
Over&Out その後 | 【iOS7】AsyncImageView が arm64 でクラッシュする件Add Star
コメントを残す