黑马程序员------SEL

来源:互联网 发布:windows phone吧 编辑:程序博客网 时间:2024/05/18 03:38

------- IOS开发IOS培训、期待与您交流! -------


1. 方法的存储位置

每个类的方法列表都存储在类对象中

每个方法都有一个与之对应的SEL类型的对象

根据一个SEL对象就可以找到方法的地址,进而调用方法

SEL类型的定义

typedef struct objc_selector *SEL;

 

2. SEL对象的创建

SEL s = @selector(test);

SEL s2 = NSSelectorFromString(@"test");

 

3. SEL对象的其他用法

// SEL对象转为NSString对象

NSString *str = NSStringFromSelector(@selector(test));

 

Person *p = [Person new];

// 调用对象ptest方法

[p performSelector:@selector(test)];

-------------------------------------------------

#import <Foundation/Foundation.h>

@interface Person : NSObject

+ (void)test;

- (void)test2;

- (void)test3:(NSString *)abc;

@end

-------------------------------------------------------

#import "Person.h"


@implementation Person

+ (void)test

{

    NSLog(@"test-----");

}


- (void)test2

{

    // _cmd代表着当前方法

    

    NSString *str = NSStringFromSelector(_cmd);

    

    // 会引发死循环

    // [self performSelector:_cmd];

    

    NSLog(@"调用了test2方法-----%@", str);

}


- (void)test3:(NSString *)abc

{

    NSLog(@"test3-----%@", abc);

}

@end

--------------------------------------------------------------------

/*

 SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法

 

 

 其实消息就是SEL

 */


#import <Foundation/Foundation.h>

#import "Person.h"


int main()

{

    Person *p = [[Person alloc] init];

    

    [p test2];

    

//    NSString *name = @"test2";

//    

//    SEL s = NSSelectorFromString(name);

//    

//    [p performSelector:s];

    

    

    // 间接调用test2方法

    //[p performSelector:@selector(test2)];

    

    //[p test3:@"123"];

    

    

//    SEL s = @selector(test3:);

//    

//    [p performSelector:s withObject:@"456"];

    

    //[p test2];

    

    // 1.把test2包装成SEL类型的数据

    // 2.根据SEL数据找到对应的方法地址

    // 3.根据方法地址调用对应的方法

    return 0;

}


0 0
原创粉丝点击