• Stars
    star
    210
  • Rank 187,585 (Top 4 %)
  • Language
    Objective-C
  • Created almost 9 years ago
  • Updated over 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

用起来很像performselector,但是完全没有参数个数限制,以及参数id类型限制,(任意类型 struct int bool),功能上很像运行时Objc_msgSend,但是在64位上无需强制类型转换,可以直接输入参数

vk_msgSend

引子

写这个工具的初衷,无依赖和引用去调用方法,在OC里面使用起来各种不方便

  • 现有的NSObject中的方法performSelector:withObject:使用起来不够直接,并且有太多限制
  • 使用runtimeobjc_msgSend的方法,在32位时代还算好用,到了64位的时候,调用起来必须强制转换
  • 使用runtime来获取Class,进而获取Method,进而获取Imp进行直接调用,同objc_msgSend一模一样,都必须强制类型转换
  • 依赖注入的框架太大太重了,未免杀鸡用牛刀

功能

  • 可以无需import变可直接调用对象的方法
  • 可以调用类方法,实例方法
  • 可以支持intfloatNSIntegerCGFloat,等基础类型
  • 可以支持CGSizeCGRectCGPoint,等8个系统结构体
  • 可以支持任意id类型

使用

对一个对象调用一个实例方法

既然目的是不想import文件,首先要有一个对象嘛

Class cls = NSClassFromString(@"testClassA");
id<vk_msgSend> abc = [[cls alloc]init];

有了对象就可以最简单的使用了,这个testClassA有一个方法

-(NSString*)testfunction:(int)num withB:(float)boolv

使用方法

NSString *return = [abc vk_callSelector:@selector(testfunction:withB:) error:&err,4,3.5f];

使用起来很简单是不?让id类对象声明遵从<vk_msgSend>协议,便可以放心大胆的调用,传入selector,传入一个error错误信息指针,后面直接是可变参数设计,直接塞入所需要的参数就可以了

对一个类调用一个类方法

直接将类,转成遵从<vk_msgSend>协议的id,即可调用

Class cls = NSClassFromString(@"testClassA"); 
[(id<vk_msgSend>)cls vk_callSelector:@selector(testfunction:withB:withH:) error:nil,4,3.5,@"haha"];

返回值Notes

如果原函数返回值是基础类型intfloatNSIntegerCGFloat等,或者CGSizeCGRectCGPoint等结构体,返回的数值会被封装成NSValue或者NSNumber,此处还没找到更好的处理办法

方法例子:

-(NSInteger)testfunction:(int)num withB:(float)boolv withC:(NSString*)str
-(CGRect)testfunction:(int)num withB:(float)boolv withC:(NSString*)str withE:(NSRange)rect

调用例子: 第一个方法

NSNumber *return3 = [abc vk_callSelectorName:@"testfunction:withB:withC:" error:&err,4,3.5,@"haha"];
NSInteger tureReturn3 = [return3 integerValue];
// need intValue

第二个方法

NSValue *return5 = [abc vk_callSelector:@selector(testfunction:withB:withC:withE:) error:nil,4,3.5,@"haha", NSMakeRange(1, 3)];
CGRect trueReturn5 = [return5 CGRectValue];
//need CGRectValue

之所以需要额外写的原因,是因为声明函数的时候,返回值不知道如何通用匹配。

参数之所以可以通用匹配是因为使用了可变参数。

不知道有没有更好的办法。

其他方法

其实不仅支持输入SEL,直接输入string型的,具体参见Demo里面的测试用例

+ (id)vk_callSelector:(SEL)selector error:(NSError *__autoreleasing *)error,...;
+ (id)vk_callSelectorName:(NSString *)selName error:(NSError *__autoreleasing *)error,...;
- (id)vk_callSelector:(SEL)selector error:(NSError *__autoreleasing *)error,...;
- (id)vk_callSelectorName:(NSString *)selName error:(NSError *__autoreleasing *)error,...;

对比

  • performSelector缺点
    • 参数限制,performSelector只支持id
    • 参数个数,performSelector在NSObject里系统最多只支持4个参数
    • 用法,每加一个参数必须多写一个withObject,过于麻烦
  • objc_msgSend缺点
    • 32Bit下使用起来非常方便
    • 64Bit下由于系统底层传参方案改动非常大,因此强制要求进行参数类型,返回类型的函数类型转换,如果不进行类型转换,像32Bit那样直接调用就会crash
    • 每一次调用都,手写调用函数的类型转换,也是挺麻烦的
  • runtime的Imp调用缺点
    • Impobjc_msgSend其实是同一个原因,二者本是一个意思

补充

block,id *,SEL都支持完毕

但是 id* 我有点心虚,求code review

Class 也支持完毕

More Repositories

1

VKDevTool

一个可以脱离Xcode的debug,直接在app里,打印内存对象,动态改UI,动态跑oc代码的多功能控制台
Objective-C
133
star
2

AsyncDisplayKitDocTranslation

完全没有翻译文档的经验,碰到一些用词不合适的时候,还是推荐对比这原文进行观看,如果愿意,大家可以帮忙一起修改
113
star
3

VKURLAction

基于target-selector 而非基于block注册式的 openURL url参数解析+运行时行为处理,各自行为还需要自定义,定义好行为,无需统一注册,即可生效
Objective-C
92
star
4

VKCssProtocol

一个很像css,在iOS里用原生的方式,将样式和界面隔离解耦,多种样式属性自由组合,以类似协议的形式将样式生效在界面UI上的东西
Objective-C
91
star
5

VKKeychainIDFV

iOS下的UUID方案,没啥技术含量,idfv+keychain保证不变
Objective-C
72
star
6

VKSafariDomainBridge

一个在iOS9下才可以支持的,app跨域访问外部safari数据的工具,主要用于wap网页上产生了数据,在app下载后读取数据,延续wap的行为
Objective-C
46
star
7

JSPatchPlaygroundTool

不需要重新编译重新运行APP,直接在模拟器里就可以随时修改JS代码,随时看效果,实时报错提醒,实时Reload刷新
Assembly
29
star
8

VKSniffer

网络请求嗅探日志
Objective-C
18
star
9

iOSCodeReviewTipsCollection

www.reviewcode.cn平台案例整理汇总
12
star
10

VKFMDBHelper

针对FMDB,写的一套ORM和SQL辅助工具,1)自动的orm,将fmdb返回的字典转换成对象,2)自动的sql生成与处理,支持链式语法无需学习sql,生成sql语句
Objective-C
12
star
11

VKMarkHelper

标记位工具:对于第一次开启某模块,每自然日执行一次某功能,这两种标记位功能,进行动态的添加,动态的使用,并且可以享受xcode代码提示
Objective-C
10
star
12

antlrDemo

JavaScript
9
star
13

Awhisper.github.io

HTML
8
star
14

markdown2json

JavaScript
4
star
15

VKKeyCommands

一个简单的快捷键事件捕捉+摇一摇事件捕捉器
Objective-C
2
star
16

JSNativeInvocation-WebViewPlugin

施工中
Objective-C
1
star
17

VKEditor

开一个编辑器的坑
1
star
18

MyWxApp

JavaScript
1
star
19

ClipboardJSDemo

JavaScript
1
star