天天看点

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

SEL基本数据类型                                                                                                                                                          

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

1:消息机制          

2:用SEL基本数据类型       

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

OC语法<3.4> OC中特有的语法: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