代碼demo
已在Github
開源, MXRuntimeUtils, 若是能幫助到您,請幫忙點個星star哈,謝謝!html
MXRuntimeUtils 是用於替換 -[NSObject performSelector:object:object:]的工具,很是容易使用!git
若是你想使用如下方法github
- (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 ....];
複製代碼
僅僅一行代碼spa
[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
code
示例代碼中的demo
截圖就像這樣, 可是你會有點疑惑,爲何我傳的值是字符類型char 3
,轉換成數字類型咋變成了51
了,事實上, 在 ASCII
中 char value '3'
就是 數字 51
, 就像 'A'
是 65
, 'a' 是 97
同樣 orm
若是你傳一個 CGPoint
類型的值給一個 聲明爲int類型的方法參數,斷言會觸發,你會在Xcode控制檯
中獲得如下截圖信息cdn
容許傳兩個以上的參數htm
獲得任何類型的返回值