我正在尝试在运行时注入我的代码来委托tableView:didSelectRowAtIndexPath:。我有以下代码:
static void overridingDidSelectCellAtIndexPath(void (^listener)(id _self, UITableView *tableView, NSIndexPath *indexPath)) {
Method didSelectRowAtIndexPath = class_getInstanceMethod([ViewController class], @selector(tableView:didSelectRowAtIndexPath:));
IMP originalImp = method_getImplementation(didSelectRowAtIndexPath);
void (^bl)(id, UITableView *, NSIndexPath *) = ^(id _self, UITableView *tableView, NSIndexPath *indexPath) {
originalImp(_self, @selector(tableView:didSelectRowAtIndexPath:), tableView, indexPath);
listener(_self, tableView, indexPath);
};
IMP newImp = imp_implementationWithBlock((__bridge id)((__bridge void*)bl));
method_setImplementation(didSelectRowAtIndexPath, newImp);
}
我在:
中调用它- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
overridingDidSelectCellAtIndexPath(^(id _self, UITableView *tableView, NSIndexPath *indexPath) {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[cell.textLabel setText:@"Hello"];
});
return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}
导致崩溃的行:
originalImp(_self, @selector(tableView:didSelectRowAtIndexPath:), tableView, indexPath);
我也不例外,我的回溯来自lldb:
* thread #1: tid = 0x75249, 0x37b9b0f8 libobjc.A.dylib`objc_retain + 8, queue =
'com.apple.main-thread, stop reason = EXC_BAD_ACCESS (code=1, address=0x8)
frame #0: 0x37b9b0f8 libobjc.A.dylib`objc_retain + 8
frame #1: 0x0000aab0
GetAllMethods`__overridingDidSelectCellAtIndexPath_block_invoke(.block_descriptor=0x14d49870, _self=0x14d48690, tableView=0x15121400, indexPath=0x14d51870) + 120 at ViewController.m:68
frame #2: 0x300e30ca UIKit`-[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1078
frame #3: 0x30196862 UIKit`-[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 214
frame #4: 0x30046780 UIKit`_applyBlockToCFArrayCopiedToStack + 316
frame #5: 0x2ffbe7ba UIKit`_afterCACommitHandler + 430
frame #6: 0x2d80cf68 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
frame #7: 0x2d80a8f6 CoreFoundation`__CFRunLoopDoObservers + 286
frame #8: 0x2d80ac42 CoreFoundation`__CFRunLoopRun + 738
frame #9: 0x2d775470 CoreFoundation`CFRunLoopRunSpecific + 524
frame #10: 0x2d775252 CoreFoundation`CFRunLoopRunInMode + 106
frame #11: 0x324af2ea GraphicsServices`GSEventRunModal + 138
frame #12: 0x3002a844 UIKit`UIApplicationMain + 1136
frame #13: 0x0000b080 GetAllMethods`main(argc=1, argv=0x27dfecdc) + 116 at main.m:16