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

本文深入探讨了Objective-C中SEL的概念及其应用,包括方法的存储位置、SEL对象的创建与使用等核心内容,并通过实例展示了如何利用SEL进行动态方法调用。

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

}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值