登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

MXRuntimeUtils用于替换 performSelector:object:支持传入基本数据类型

[复制链接]
来自: hbxn740150254 分类: iOS精品源码 上传时间: 2018-11-7 20:09:48
Tag:

项目介绍:

代码demo已在Github开源, MXRuntimeUtils如果帮助到您,请点个星star,谢谢!

MXRuntimeUtils 是用于替换 -[NSObject performSelector:object:object:]的工具,非常容易使用!

  -[NSObject performSelector:object:object:] 出现哪些问题?

如果你想使用以下方法


- (id)testMethodWithIntValue:(int)aIntValue floatValue:(float)aFloatValue charValue:(char)aCharValue sizeValue:(CGSize)aCGSizeValue pointValue:(CGPoint)aCGPointValue edgeInsetsValue:(UIEdgeInsets)anUIEdgeInsetsValue stringValue:(NSString *)aStringValue idValue:(id)anIdValue {

    return @[@(aIntValue), @(aFloatValue), @(aCharValue), [NSValue valueWithCGSize:aCGSizeValue], [NSValue valueWithCGPoint:aCGPointValue], [NSValue valueWithUIEdgeInsets:anUIEdgeInsetsValue], aStringValue, anIdValue];

}

而且你想调用 -[self testMethodWithIntValue:floatValue:charValue:sizeValue:pointValue: edgeInsetsValue: stringValue:idValue:]但是用另一种方式来表达 -[self performSelector:object:object:] , 你可能感到懵逼, 因为 -[NSObject performSelector:withObject:withObject:]] 最高仅仅允许传两个值,而且还只能是id类型,那么,你怎么传基本数据类型,比如像 BOOL, char, int, float ,甚至超过两个参数的上限呢!


//[self performSelector:@selector(testMethodWithIntValue:floatValue:charValue:sizeValue:pointValue:edgeInsetsValue:stringValue:idValue:) withObject:one withObject:two ....];

如何使用

仅仅一行代码


[MXRuntimeUtils callMethodWithTarget:self selector:@selector(testMethodWithIntValue:floatValue:charValue:

sizeValue:pointValue:edgeInsetsValue:stringValue:idValue:) argumemts:@[@1, @2.0f, [NSNumber numberWithChar:'3'], [NSValue valueWithCGSize:CGSizeMake(4, 4)], 

[NSValue valueWithCGPoint:CGPointMake(5, 5)], [NSValue valueWithUIEdgeInsets:UIEdgeInsetsMake(6, 6, 6, 6)], @"7", @"8"] returnValue:&returnValue];

如果你的原始方法有一个返回值,那么就传一个返回值类型的指针,就像这样,如果你的返回值是一个OC对象, 注意要传一个 __autoreleasing 变量就像 这样 __autoreleasing NSString stringReturnValue,  __autoreleasing id idReturnValue 而不是NSString stringReturnValue,  id idReturnValue, 理由你可以看看这篇文章  memory management


//int returnValue 

int sumReturnValue = 0;

[MXRuntimeUtils callMethodWithTarget:self selector:@selector(sumWithAnIntValue:anotherIntValue) argumemts:@[@1, @2] returnValue:&returnValue];

//sumReturnValue = 3;

//id returnValue 

__autoreleasing id idReturnValue = nil;//avoid idReturnValue is dealloc after method invoking

[MXRuntimeUtils callMethodWithTarget:self selector:@selector(ConvertIntValueToIdType:) argumemts:@[@1] returnValue:&idReturnValue];

//idReturnValue = @1;

之后你就可以从sumReturnValue中得到数字3, idReturnValue中得到1

屏幕截图

示例代码中的demo 截图就像这样, 但是你会有点疑惑,为什么我传的值是字符类型char 3,转换成数字类型咋变成了51了,事实上, 在 ASCIIchar value '3' 就是 数字 51,  就像 'A'65, 'a' 是 97 一样

运行结果

特性

  • 自动类型检查

如果你传一个 CGPoint类型的值给一个 声明为int类型的方法参数,断言会触发,你会在Xcode控制台中得到以下截图信息

  • 允许传两个以上的参数

  • 得到任何类型的返回值

自动类型检查

相关源码推荐:

我来说两句
*滑动验证:
所有评论(5)
A7472 2018-11-8 10:11:29
支持,感谢,祝code4app越来越好~
回复
littleRed 2018-11-8 10:11:36
支持,感谢,祝code4app越来越好~
回复
Wsdtg 2018-11-8 10:11:44
感谢分享,code4app有你更精彩
回复
打个酱油的 2018-11-8 10:11:54
mark,收藏了
回复
ou大神 2018-11-8 10:12:05
感谢分享,code4app有你更精彩
回复
这是个逗比 2018-11-8 10:12:29
相当不错,感谢无私分享精神!
回复
superBee 2018-11-8 14:27:15
楼主用心了,内容非常精彩。
回复
提取码:  下载次数:1 状态:已购或VIP 售价:0(原价:15)金钱 下载权限:初级码农 
186 1 1
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,742864542

如何获得代码达人称号?

代码贡献英雄榜
用户名 下载数
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表