performSelector: withObject:基本用法
[self performSelector:@selector(test)];
[self performSelector:@selector(test:) withObject:@"測(cè)試"];
[self performSelector:@selector(test:) withObject:@"測(cè)試" afterDelay:1.0];
當(dāng)調(diào)用的方法參數(shù)為基本數(shù)據(jù)類(lèi)型時(shí),如:
-(void)test:(NSInteger)count
這個(gè)時(shí)候如果你這樣調(diào)用的話的不會(huì)成功的
NSNumber *num = [NSNumber numberWithInt:2];
[self performSelector:@selector(test:) withObject:num];
//或
[self performSelector:@selector(test:) withObject:@2];
控制臺(tái)打印結(jié)果:
------收到傳遞的值為:-7964262576567589500
有木有發(fā)現(xiàn)你傳的是int 2,收到的是負(fù)數(shù),封裝成NSNumber對(duì)象也不行
那么我們到底要怎么做才能通過(guò)調(diào)用performSelector: withObject:實(shí)現(xiàn)基本數(shù)據(jù)類(lèi)型傳遞呢?
我們先看看系統(tǒng)提供的NSInvocation類(lèi)
- 這里我們可以先利用NSSelectorFromString將字符串反射成SEL方法
- 利用NSInvocation再進(jìn)行封裝
SEL aSelector = NSSelectorFromString(@"test:");
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:aSelector]];
- NSInvocation類(lèi)可以設(shè)置SEL屬性
@property SEL selector;
將反射后的SEL設(shè)置給inv
[inv setSelector:aSelector];
- 封裝參數(shù)
NSInteger paramType = 10;
[inv setArgument:&(paramType) atIndex:2];
-
完整代碼如下:
image.png 控制臺(tái)輸出結(jié)果
------收到傳遞的值為:10