关于performSelector drum pads 24,怎么带参数

Cocoa内置只支持两个参数,要超过两个参数以上怎么办呢,下面代码展示了如何实现一个自己的方法来调用超过7个参数(来自three20)
- (id)performSelector:(SEL)selector withObject:(id)p1 withObject:(id)p2 withObject:(id)p3
&&& withObject:(id)p4 withObject:(id)p5 withObject:(id)p6 withObject:(id)p7
& NSMethodSignature *sig = [self methodSignatureForSelector:selector];
& if (sig) {
&&& NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig];
&&& [invo setTarget:self];
&&& [invo setSelector:selector];
&&& [invo setArgument:&p1 atIndex:2];
&&& [invo setArgument:&p2 atIndex:3];
&&& [invo setArgument:&p3 atIndex:4];
&&& [invo setArgument:&p4 atIndex:5];
&&& [invo setArgument:&p5 atIndex:6];
&&& [invo setArgument:&p6 atIndex:7];
&&& [invo setArgument:&p7 atIndex:8];
&&& [invo invoke];
&&& if (sig.methodReturnLength) {
&&&&& id anO
&&&&& [invo getReturnValue:&anObject];
&&&&& return anO
&&& } else {
& } else {
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:19388次
排名:千里之外
原创:19篇
(1)(1)(6)(1)(5)(1)(1)(1)(1)(2)benjielin 的BLOG
用户名:benjielin
文章数:240
评论数:331
访问量:633100
注册日期:
阅读量:26802
51CTO推荐博文
&&& Selector是Objective-C一个非常强大的特性,合理使用Selector可以大大简化实现并避免重复代码。但NSObject提供的performSelector最多只支持两个参数,对于两个以上的参数就无能为力了。一番调查后针对NSObject增加了如下扩展,使得performSelector可以支持传入参数数组。多个参数就不再是问题了。
@interface NSObject (Addition)
- (id)performSelector:(SEL)selector withObjects:(NSArray *)
@implementation NSObject (Addition)
- (id)performSelector:(SEL)selector withObjects:(NSArray *)objects {
&&& NSMethodSignature *signature = [self methodSignatureForSelector:selector];
&&& if (signature) {
&&&&&&& NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature];
&&&&&&& [invocation setTarget:self];
&&&&&&& [invocation setSelector:selector];
&&&&&&& for(int i = 0; i & [objects count]; i++){
&&&&&&&&&&& id object = [objects objectAtIndex:i];
&&&&&&&&&&& [invocation setArgument:&object atIndex: (i + 2)];&&&&&&&
&&&&&&& [invocation invoke];
&&&&&&& if (signature.methodReturnLength) {
&&&&&&&&&&& id anO
&&&&&&&&&&& [invocation getReturnValue:&anObject];
&&&&&&&&&&& return anO
&&&&&&& } else {
&&&&&&&&&&&
&&& } else {
@end本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
18:54:25 18:59:21 13:22:37performSelector&&&@selector
Posted by redstar on 五月 23, 2011 in&&|
Object-C中@selector关键字 是用来搜索方法的,将方法转换成SEL类型的变量。
上面的代码声明了一个Car类,并且设置其中的两个属性为非原子性的、自动生成getter方法(使用了@property)。
上面代码是实现了Car类& ,使用了@synthesize关键字声明
该属性自动生成setter方法。
这段代码中@selector 搜索setMake方法 并返回SEL类型的变量。
格式如下:
SEL 变量名 =& @selector(方法名
:&& 第二个参数名 :&
&&& [myCar2
performSelector:carMethod withObject:@"11111" withObject:@"2222"
afterDelay:10];
这句话将搜索到的SEL类型的消息 发送给 myCar2对象。
performSelector关键字可以调用到SEL类型的变量。延迟十秒执行。
其语句格式如下:
[消息接受者&&&&
performSelector:SEL类型的变量&&&
withObject:&
第一个参数&&
withObject:&
第二个参数&& afterDelay :秒数];
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)
知识点:这个方法是单线程的,也就是说只有当前调用此方法的函数执行完毕后,selector方法才会被调用。
- (void)mainMethod
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1];
NSLog(@"调用方法==开始");
NSLog(@"调用方法==结束");
- (void)delayMethod
NSLog(@"执行延迟方法");
执行结果(注意log打印的顺序):
调用方法==开始
调用方法==结束
执行延迟方法
实战经验:正因为本方法是一个单线程的,所以有些时候,我们会遇到虽然调用了这个方法,但是不执行的问题。这时,我们需要将原代码改造如下:
改造前代码:无法执行延迟方法
-(void)someMethod
[self performSelector:@selector(labelDidDisappeared:) withObject:label afterDelay:2];
//因为某些原因,不被调用,没有执行
-(void)labelDidDisappeared:(UILabel *)label
[label removeFromSuperview];
[label release];
改造后代码: &可以正常执行延迟方法
-(void)someMethod
[self performSelectorOnMainThread:@selector(labelWillDisappeared:) withObject:label waitUntilDone:NO];
-(void)labelWillDisappeared:(UILabel *)label
[self performSelector:@selector(labelDidDisappeared:) withObject:label afterDelay:2];
-(void)labelDidDisappeared:(UILabel *)label
[label removeFromSuperview];
[label release];
&知识扩展:以下两个方法均是多线程方法
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)
参考:& 感谢原作者的无私和奉献!
知识点:该方法只能接受一个参数。如果需要传递多个参数怎么办呢?&让selector调用的方法接受的参数类型修改为Dictionary类型。
(1)如果调用的selector不接受参数则,withObject:nil&
(2) 通过performSelector:withObjcet:afterDelay调用的方法不能有返回值
&知识扩展:performSelector 带多个参数
//第一个试验:带一个参数
- (void) fooOneIput:(NSString*) first {
NSLog(@"Logs %@", first);
//然后调用它
[self&performSelector:@selector(fooOneInput:) withObject:@"first"];
//第二个试验:带多个参数
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second {
NSLog(@"Logs %@ then %@", first, second);
//然后调用它
[self&performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first"&withObject:@"second"];
实战经验:经实验,只有performSelector: withObject: 方法可以带多个参数,其它类似的perform方法均不行,包括和此方法最类似的performSelectorInBackground:withObject: 方法。
延伸阅读:
阅读(...) 评论()原文作者Andrew Huang && 转载请注明作者
&& & @selector()基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.
&& &它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)?因此我们有如下代码。
一.取得selector值.
&& &int add(int val)
&& & &return val+1;
&& &int (* c_func)(int val); //定义一个函数指针变量
&& c_func = &//把函数addr地址直接赋给c_func
object-c的选择器
&& @interface foo
&& -(int)add:
&& SEL class_ //定义一个类方法指针
&& class_func = @selector(add:int);
&&注意1. @selector是查找当前类的方法,而[object @selector(方法名:方法参数..) ] ;是取object对应类的相庆方法.
&&注意2.查找类方法时,除了方法名,方法参数也查询条件之一.
&&注意3. 可以用字符串来找方法&SEL 变量名 = NSSelectorFromString(方法名字的字符串);
&&注意4. 可以运行中用SEL变量反向查出方法名字字符串
&& & &&NSString *变量名 = NSStringFromSelector(SEL参数);
二.执行selector值.
&& 取得相应值后,怎么处理SEL值呢,这一点仍然与函数指针一样,就是执行它
&& 函数指针执行,(以下有几种等效形式)
&& & *c_func(10);
&& & c_func(10);
&&SEL变量的执行.用performSelecor方法来执行.
&&&[对象 performSelector:SEL变量 withObject:参数1 withObject:参数2];
三.selector的应用场合
&& selector本质是跟C的回调函数一样。主要用于两个对象之间进行松耦合的通讯.这种方法基本上整个Cocoa库之间对象,控制之间通讯都是在这个基础构建的。
阅读(...) 评论()}

我要回帖

更多关于 elector drum pads 24 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信