Objective-C的hook方案(一): Method Swizzling
2015-10-16 16:53
525 查看
在 OS X下创建一个Command Line Tool工程,
用类别的方法继承与NSArray,代码如下:
#import <Foundation/Foundation.h>
@interface NSArray (Swizzle)
- (id)myLastObject;
@end
#import "NSArray+Swizzle.h"
---------------------------------------------------------------------------------------------------
@implementation NSArray (Swizzle)
- (id)myLastObject{
id ret=[self myLastObject];
NSLog(@"********myLastObject ************");
NSLog(@"********myLastObject*************");
return ret;
}
@end
在main.m中写如下代码:-------------------------------------------------------------------------------------
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import "NSArray+Swizzle.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Method ori_Metod= class_getInstanceMethod([NSArray class], @selector(lastObject));
Method my_Method=class_getInstanceMethod([NSArray class], @selector(myLastObject));
method_exchangeImplementations(ori_Metod, my_Method);
//IMP--关键字
NSArray *array=@[@"0",@"1",@"2",@"3"];
NSString *string=[array lastObject];
//NSString *string=@"asd";
NSLog(@"TEST RESULT:%@",string);
}
return 0;
}
------------------------------------------------------------------------如下打印结果
2015-10-16 16:26:09.244 TestOneHook[15121:1192366] ********myLastObject ************
2015-10-16 16:26:09.244 TestOneHook[15121:1192366] ********myLastObject*************
2015-10-16 16:26:09.245 TestOneHook[15121:1192366] TEST RESULT: 3
用类别的方法继承与NSArray,代码如下:
#import <Foundation/Foundation.h>
@interface NSArray (Swizzle)
- (id)myLastObject;
@end
#import "NSArray+Swizzle.h"
---------------------------------------------------------------------------------------------------
@implementation NSArray (Swizzle)
- (id)myLastObject{
id ret=[self myLastObject];
NSLog(@"********myLastObject ************");
NSLog(@"********myLastObject*************");
return ret;
}
@end
在main.m中写如下代码:-------------------------------------------------------------------------------------
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import "NSArray+Swizzle.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Method ori_Metod= class_getInstanceMethod([NSArray class], @selector(lastObject));
Method my_Method=class_getInstanceMethod([NSArray class], @selector(myLastObject));
method_exchangeImplementations(ori_Metod, my_Method);
//IMP--关键字
NSArray *array=@[@"0",@"1",@"2",@"3"];
NSString *string=[array lastObject];
//NSString *string=@"asd";
NSLog(@"TEST RESULT:%@",string);
}
return 0;
}
------------------------------------------------------------------------如下打印结果
2015-10-16 16:26:09.244 TestOneHook[15121:1192366] ********myLastObject ************
2015-10-16 16:26:09.244 TestOneHook[15121:1192366] ********myLastObject*************
2015-10-16 16:26:09.245 TestOneHook[15121:1192366] TEST RESULT: 3
相关文章推荐
- 【数据存储】coredata、sqlite、fmdb和sqlitepersistentobject
- [Object-C]iOS9适配系列教程
- 十分钟让你明白Objective-C的语法(和Java、C++的对比)
- Object-C 零碎知识点笔记
- objc_setAssociatedObject的用法,解决UIAlertView按钮传值问题
- oc 数组Array
- js如何打印object对象
- Fixed Objects Statistics and why they are important
- Foundation 之 NSString和NSMutableString
- 论文笔记(3)You Only Look Once:Unified, Real-Time Object Detection
- 线程等待 推荐WaitForSingleObject() 不推荐busyLoop
- Object-C -----1
- js如何打印object对象
- Objective-C中的一些细枝末节01(更新)
- Servlet,JDBC,JSONObject三者配和处理客户端请求并返回正确的json数据
- iOS基础深入理解 Objective中@class的含义
- Android属性动画之ObjectAnimator和AnimatorSet
- List<HashMap<String, Object>> mylist...按照键值对来解析
- 直接对Object数组进行赋值
- 解决嵌套list类型的JSONObject/JSONArray转换成原来list问题。