@@ -19,7 +19,7 @@ @interface StingerParams ()
1919@property (nonatomic ) IMP originalIMP;
2020@property (nonatomic ) void **args;
2121@property (nonatomic ) NSArray *argumentTypes;
22- @property (nonatomic ) NSArray *arguments;
22+ @property (nonatomic ) NSMutableArray *arguments;
2323@end
2424
2525@implementation StingerParams
@@ -46,13 +46,37 @@ - (SEL)sel {
4646}
4747
4848- (NSArray *)arguments {
49- return _arguments;
49+ return [ _arguments copy ] ;
5050}
5151
5252- (NSString *)typeEncoding {
5353 return _types;
5454}
5555
56+ // / 修改函数参数
57+ // / - Parameters:
58+ // / - arg: 对应的参数,值类型请转换为NSValue传递
59+ // / - idx: 序号,默认从0开始
60+ - (void )setArgument : (id )arg atIndex : (NSInteger )idx {
61+ _arguments[idx]= arg;
62+ NSString *argTypeStr = _argumentTypes[idx + 2 ];
63+ const char *argType = argTypeStr.UTF8String ;
64+ if (strcmp (argType, @encode (id )) == 0 || strcmp (argType, @encode (Class )) == 0 ) {
65+ void **objPointer = _args[idx + 2 ];
66+ *objPointer = (__bridge void *)(arg);
67+ return ;
68+ }
69+ if ([arg isKindOfClass: NSValue .class]) {
70+ if (@available (iOS 11.0 , *)) {
71+ NSUInteger valueSize = 0 ;
72+ NSGetSizeAndAlignment (argType, &valueSize, NULL );
73+ [(NSValue *)arg getValue: _args[idx + 2 ] size: valueSize];
74+ } else {
75+ [(NSValue *)arg getValue: _args[idx + 2 ]];
76+ }
77+ }
78+ }
79+
5680- (void )invokeAndGetOriginalRetValue : (void *)retLoc {
5781 NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes: _types.UTF8String];
5882 NSInteger count = signature.numberOfArguments ;
@@ -69,12 +93,11 @@ - (void)invokeAndGetOriginalRetValue:(void *)retLoc {
6993#pragma - mark Private
7094
7195- (void )st_genarateArguments {
72- NSMutableArray *args = [[ NSMutableArray alloc ] initWithCapacity: _argumentTypes.count ];
96+ _arguments = [NSMutableArray array ];
7397 for (NSUInteger i = 2 ; i < _argumentTypes.count ; i++) {
7498 id argument = [self st_argumentWithType: _argumentTypes[i] index: i];
75- [args addObject: argument ?: NSNull .null];
99+ [_arguments addObject: argument ?: NSNull .null];
76100 }
77- _arguments = [args copy ];
78101}
79102
80103- (id )st_argumentWithType : (NSString *)type index : (NSUInteger )index {
0 commit comments