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 |   
        
 
    
    
    
     
 
 |