sel

来源:互联网 发布:东辰国际学校官网通知 编辑:程序博客网 时间:2024/05/22 18:21

SEL类型


Objective-C在编译的时候,会根据方法的名字(包括参数序列),生成一个用  来区分这个方法的唯一的一个ID,这个ID就是SEL类型的。我们需要注意的是,只要方法的名字(包括参数序列)相同,那么它们的ID都是相同的。就是   说,不管是超类还是子类,不管是有没有超类和子类的关系,只要名字相同那么ID就是一样的。


 SEL方式

1.SEL 变量名 = @selector(方法名字);  

2.SEL 变量名 = NSSelectorFromString(方法名字的字符串);  

3.NSString *变量名 = NSStringFromSelector(SEL参数);  

 

其中第1行是直接在程序里面写上方法的名字,

第2行是写上方法名字的字符串,

第3行是通过SEL变量获得方法的名字。

我们得到了SEL变量之后,可以通过下面的调用来给一个对象发送消息:

 

[对象 performSelector:SEL变量 withObject:参数1 withObject:参数2];

这样的机制大大的增加了我们的程序的灵活性,我们可以通过给一个方法传递SEL参数,让这个方法动态的执行某一个方法;我们也可以通过配置文件指定需要执行的方法,程序读取配置文件之后把方法的字符串翻译成为SEL变量然后给相应的对象发送这个消息。

 

从效率的角度上来说,执行的时候不是通过方法名字而是方法ID也就是一个整数来查找方法,由于整数的查找和匹配比字符串要快得多,所以这样可以在某种程度上提高执行的效率。 


这里我讲一下selector 多参数的问题


@interface NSObject (MoreSelctorParam)
-(id)performSelector:(SEL)aSelector withObjects:(NSArray*) objects;
@end


@implementation NSObject (MoreSelctorParam)
-(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];//调用谁呢?selector啊!
        for(int i = 0; i <[objects count]; i++)

       {
            id object = [objects objectAtIndex:i];
            [invocation setArgument:&object atIndex: (i + 2)];//为什么在2   因为 0 和1 被target 和selector占用了。。
        }
        [invocation retainArguments];//防止被释放
        [invocation invoke];//调用
        //有返回值
        if (signature.methodReturnLength)
        {
            id anObject;
            [invocation getReturnValue:&anObject];
            return anObject;
        } else
        {
            return nil;
        }
    }
    else//不成功
    {
        return nil;
    }
}
@end


问题就出现了 不知道你们注意没有?


-(void) printInt:(int)i String:(NSString *)s;

-(void) printInt:(NSInteger)i String:(NSString *)s;


-(void) printInt:(id)i String:(NSString *)s;


[obj performSelector:@selector(printInt:String:) withObjects:[NSArray arrayWithObjects:[[NSNumber alloc]initWithInt:5],@"this string", nil]];

前2个结果为  i-> 151608432,s->this string

后一个结果为 i-> 5,s->this string

原创粉丝点击