您的位置:首页 > 移动开发 > Objective-C

OC语法<3.4> OC中特有的语法:SEL基本数据类型

2014-12-12 00:19 609 查看
SEL基本数据类型                                                                                                                                                          

我们OC里面调用方法有两种方式比较多:

1:消息机制          

2:用SEL基本数据类型       

我们先看一下消息机制的工作原理



详细解释:

当创建一个对象的时候,就要用到对象当中的isa指针,它使指向类的方法列表的,我们用指针P调用对象的方法时候,其实就是发一个消息给Person对象,那么这个Person对象去那里找这个方法呢?没错,就是去方法列表里面去找,那它怎么去找方法的呢?其实就是指针在发消息的时候进行了一次包装,包装成了SEL类型的一个变量,以eat方法为例,就是把消息包装成了一个sel的一个变量:SEL
s = @selector(eat); 这个变量生成的指针地址(在isa中)就去方法列表里面去找有没有这个方法,实际上方法列表里面的所有方法都是SEL数据类型的。
下面我们看个示例:
给Person类写了三个方法,一个不带参数的,一个带的,一个带返回值的
main函数

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc]init];

//调用方法有多种方式,下面这种是常用的消息机制,就是说是地址给对象发消息的机制
//[p eat];

//另外一种方式就是:越过发消息这一步,直接找到方法,用SEL数据类型
//使用@selector就能够把一个方法包装成SEL数据类型
SEL s2 = @selector(eat);
[p performSelector:s2];
SEL s3 = @selector(call:);
[p performSelector:s3 withObject:@"12312234234"];

SEL s5 = @selector(findName);
NSString *str = [p performSelector:s5];
NSLog(@"str为:%@",str);

//上面的看懂之后也可以简写成下面
[p performSelector:@selector(eat)];
[p performSelector:@selector(call:) withObject:@"123456788"];
NSString *str2 = [p performSelector:@selector(findName)];
NSLog(@"str2 为:%@",str2);

}
return 0;
}
Person的.h文件

#import <Foundation/Foundation.h>

@interface Person : NSObject

-(void)eat;
-(void)call:(NSString *)number;
-(NSString *)findName;

@end
Person的.m文件

#import "Person.h"

@implementation Person

-(void)eat
{
NSLog(@"吃东西");
}

-(void)call:(NSString *)number
{
NSLog(@"打电话需要的号码:%@",number);
}
-(NSString *)findName
{
return @"找到了义哥的名字";
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Objective-C SEL