sel

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:参数1withObject:参数2];

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

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


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


@interfaceNSObject(MoreSelctorParam)
-(id)performSelector:(SEL)aSelectorwithObjects:(NSArray*)objects;
@end


@implementationNSObject(MoreSelctorParam)
-(id)performSelector:(SEL)selectorwithObjects:(NSArray*)objects
{
NSMethodSignature*signature=[selfmethodSignatureForSelector:selector];//方法签名
if(signature)//如果签名成功
{
NSInvocation*invocation=[NSInvocationinvocationWithMethodSignature:signature];//调用
[invocationsetTarget:self];
[invocationsetSelector:selector];//调用谁呢?selector啊!
for(inti=0;i<[objectscount];i++)

{
idobject=[objectsobjectAtIndex:i];
[invocationsetArgument:&objectatIndex:(i+2)];//为什么在2因为0和1被target和selector占用了。。
}
[invocationretainArguments];//防止被释放
[invocationinvoke];//调用
//有返回值
if(signature.methodReturnLength)
{
idanObject;
[invocationgetReturnValue:&anObject];
returnanObject;
}else
{
returnnil;
}
}
else//不成功
{
returnnil;
}
}
@end


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


-(void)printInt:(int)iString:(NSString*)s;

-(void)printInt:(NSInteger)iString:(NSString*)s;


-(void)printInt:(id)iString:(NSString*)s;


[objperformSelector:@selector(printInt:String:)withObjects:[NSArrayarrayWithObjects:[[NSNumberalloc]initWithInt:5],@"thisstring",nil]];

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值