代码如下:
+ (void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [NSURLConnection class];
SEL selector = @selector(initWithRequest:delegate:);
SEL swizzledSelector = @selector(test_initWithRequest:delegate:);
Method originalinitWithRequest = class_getInstanceMethod(class, selector);
NSURLConnection* (^swizzleBlock)(NSURLConnection *,SEL,NSURLRequest*,id )= ^(NSURLConnection *slf,SEL swizzledSelector,NSURLRequest *request,id delegate) {
return ((NSURLConnection*(*)(NSURLConnection*,SEL,NSURLRequest*,id))objc_msgSend)(slf,swizzledSelector,request,delegate);
};
IMP implementation = imp_implementationWithBlock(swizzleBlock);
class_addMethod(class, swizzledSelector, implementation, method_getTypeEncoding(originalinitWithRequest));
Method newConnectionWithRequestClassMethod = class_getInstanceMethod(class, swizzledSelector);
method_exchangeImplementations(originalinitWithRequest, newConnectionWithRequestClassMethod);
});
}
我看了半天没发现什么问题,为什么这样一交换之后运行就会崩溃。
在return 时候打断点,信息如下:
(lldb) po slf
{ request: (null) }
(lldb) po swizzledSelector
{ URL: http://httpstat.us/200 }
(lldb) po request
(lldb) po delegate
nil
崩溃信息如下: