oc基础知识

                           基 础 知 识( SEL )

SEL代表方法,一个SEL类型数据代表一个方法。

每个对象都有一个isa指针。

每个方法都有一个与之相对应的SEL数据。

当对象调用方法时,首先会把方法包装成SEL类型的数据,通过包装后的SEL数据找到相对应的方法的地址,调用方法。

在内存中每一个SEL数据都对应一个方法的地址。

SEL就是方法的包装类型。

 

SEL这个操作是有缓存的:

因为SEL在寻找地址的时候是一个一个的找,很耗费性能。但是再第二次找的话,就会直接利用第一次的结果。(第一次会把结果记录到缓存中)。

 

调用方法还有另外一种方式:

1,直接调用  [p 方法名];

2,   间接调用 [p performSelector:@selector(方法名)];

 

怎么创建SEL数据:SEL全称 selector  SEL就是selector这个对象。

@selector(selector)  返回一个selector类型的数据

@selector(方法名):就是SEL类型的数据。

 

调用某个对象方法,就是给对象发送了一个SEL类型的数据,根据SEL数据到内存中找对应方法的地址,调用方法。

 

其实发消息就是发送的SEL,你把方法名包装成了一个SEL类型的消息,发送给这个对象,

根据SEL消息找对应的方法的地址,调用方法。

 

对象方法接收参数

-(void)test: (NSString *) a

{

[p performselector: @selector(test:) withObject :@"123123"]

}

主函数打印[p test: @"123123"]

 

SEL的含义:

typedef struct objc select      *SEL;   定义selector 叫SEL.

字符串类型

NSString * name = @“test”

不能直接调用字符串,如: [p  name] 错误语法。

需要转换成SEL 类型。

怎样把字符串转换成SEL类型。

    SEL  = [NSSelectorFromString:(name)];

               [p performSelect:s ];  然后调用。

 

每个对象内部都有一个隐藏的 _cmd,属于SEL.

不能直接打印转换

NSStringFromSelector: _cmd;

SEL会引发死循环:[self performSelector: _cmd];

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值