A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 0919Gflag 中级黑马   /  2015-10-14 23:50  /  1208 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


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

1 个回复

正序浏览
SEL:全称selector  表示方法的存储位置
这句话不太明白。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马