黑马程序员技术交流社区

标题: SEL类型 笔记 [打印本页]

作者: 8430110    时间: 2015-10-14 21:24
标题: SEL类型 笔记
1、SEL概念
                        SEL:全称selector  表示方法的存储位置
                       
3、方法在内存中的存储原理
                        Person *p=[[Person alloc] init];
                        [p test];
                        寻找方法的过程:
                        (1)首先把test这个方法名包装成sel类型的数据;
                        (2)根据SEL数据找到对应的方法地址;
                        (3)根据方法地址调用相应的方法。20
                        (4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候,就直接使用。
                       
                        关于_cmd:每个方法的内部都有一个-cmd,代表着当前方法。
                       
                       
                                注意:SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到 方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。

4、公式
                        SEL s1 = @selector(eat); //通过s1 去调用了
                        [p2 performSelector:s1];
                       
                       
                       
5、程序
我的程序

/***************************main.m********************************/
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool
    {
        Person *wangcai =[Person new];
        [wangcai run];
        
        SEL s1;                             //定义一个sel类型s1变量
        s1=@selector(run);                  //
        [wangcai performSelector:s1];
    }
    return 0;
}

/***************************Person.h*******************************/
#import <Foundation/Foundation.h>

@interface Person : NSObject
-(void)run;
@end

/***************************Person.m*******************************/
#import "Person.h"

@implementation Person
-(void)run
{
    NSLog(@"人在跑!");
}
@end



/***************************************************************/

老师程序



/***************************main.m********************************/
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
       
        Person *p = [Person new];
        
//        [p run];
        //1)run ---> SEL类型的数据
        //2)SEL 类型的数据,类中方法的SEL对比,找到方法的地址
        //3)根据方法的地址,调用run方法
        
        
        //手动把 run方法 转换为 sel类型的数据
        //  如何转@selector(方法名);
        SEL s1;
        s1 =@selector(run);
        
        //发送s1 向 p对象发送 s1
        [p performSelector:s1];   //
        
    }
    return 0;
}
/***************************Person.h*******************************/
#import <Foundation/Foundation.h>

@interface Person : NSObject
-(void)run;
@end

/***************************Person.m*******************************/
#import "Person.h"

@implementation Person

-(void)run{

    NSLog(@"人在走!");
}
@end





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2