整理几个方法:
Q1: SEL methodId=@selector(func1);
Q2:[self performSelector:methodIdwithObject:nil];
Q3:NSString*methodName = NSStringFromSelector(methodId);
Q4:IMP methodPoint = [self methodForSelector:methodId];
整理几个名词:
名词1: SEL
名词2: IMP
名词3: 成员变量
名词4: 属性
名词5: Dispatch table
名词6: Method
方法定义:
*注:来自网络。
Q1:有什么办法可以知道方法编号呢@selector()就是取类方法的编号。
SEL methodId=@selector(func1);
Q2:编号获取后怎么执行对应方法呢
[self performSelector:methodIdwithObject:nil];
Q3:有没有办法通过编号获取方法
NSString*methodName = NSStringFromSelector(methodId);
Q4:IMP怎么获得和使用
IMP methodPoint = [self methodForSelector:methodId];
methodPoint();
名词解释:
名词1: 类成员方法的指针(可以理解为实例方法+类方法的总和)
名词2: 函数指针,保存了方法的地址。
名词5: 可以理解为SEL与IMP的对应关系表
名词6: 就是函数,每个Method对应的objc_method结构体包含SEL:method_name(方法名),char:method_types(方法类型),IMP:method_imp(方法实现)
理解:
先按照个人理解解释下名词3和名词4的区别:成员变量与属性的不同就是,成员变量是通过self->调用。属性通过self.调用。
成员变量不自动生成get和set方法。而属性会自动生成get和set方法。
名词1与名词2的区别大致在于:SEL保存了方法编号,通过@selector(fun)方法获取对应方法名称的方法编号。而IMP保存的是方法地址,指向内存。
总结:
方法通过SEL找到编号,通过Dispatch table找到对应的IMP,然后再实现该方法。
参考网址:
网友评论