方法实例的地址消息将通过selector(方法实例的枚举盒)转换器入参写入objc_msgSeng函数Eg:[object hello]实例对象object的堆内存区里面存在次级实例方法hello =>> 底层触发指令objc_msgSend(object,@selector(hello))
#import <Foundation/Foundation.h>
@interface TestObject : NSObject
- (void)justTest;
@end
#import "TestObject.h"
@implementation TestObject
- (void)justTest {
NSLog(@"hello");
}
@end
main.m中主函数打断点:
int main(int argc, char * argv[]) {
@autoreleasepool {
TestObject *object = [[TestObject alloc] init];
//写入某个未定义声明不存在的函数标识名称
SEL sel = @selector(undefinedMethod);
[object justTest];
}
return 0;
// NSString * appDelegateClassName;
// @autoreleasepool {
// // Setup code that might create autoreleased objects goes here.
// appDelegateClassName = NSStringFromClass([AppDelegate class]);
// }
// return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
在[object test]出打断点
OC语法是维护了有关@selector转换器方法下的表(存储很多转换器方法名索引),通过@selector机制设备处理器会根据转换器方法名索引查找匹配的方法实例。如果完整搜索之后始终无法查找到方法名索引则会自动生成一个SEL枚举成员加入库表内进行维护。OC语法在项目编译期间会扫描文件,将文件中方法或@selector形式的方法加入oc语法维护的索引库表。
//addTarget:<#实例对象值#> action:<#枚举成员值方法本身#> forControlEvents:<#枚举成员值事件本身#>
//@selector()表达式遵循枚举结构特征(表达式的结果内容值为枚举的成员值)
//selector本身属于方法实例的枚举盒//@selector访问方法实例的枚举盒
//@selector(<#selector#>)入参传入方法的基本名、行参元等标识符获取表达式的结果内容值(枚举的方法实例成员值)
- (void)seletorMethod {//转换器selector原理分析
}