您的位置:首页 > 移动开发 > Objective-C

第01天实战技术(07):Runtime(消息机制)

2017-03-24 00:00 295 查看
#####一、了解runtime的机制

1.分解runtime

id objc = [NSObject alloc]; // 分配内存
objc = [objc init]; //  初始化

// 最终生成消息机制, 编译器做的事情
// 最终代码, 需要把当前重新编译,用Xcode编译器,clang
// clang -rewrite-objc main.m 查看最终生成代码
// 最终会转换为 c++
// 通过编译器 最终会生成一个 main.cpp (c++的文件) // 如何快速查找代码


2.最终通过终端 通过clang编译器 转换为最终生成代码(c++) main.cpp

int main(int argc, const char * argv[]) {
/* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;

id objc = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc"));
objc = ((id (*)(id, SEL))(void *)objc_msgSend)((id)objc, sel_registerName("init"));

}
return 0;
}


3.分解代码

// NSString *str = (NSString *)@1; // (NSString *) 强转
((void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc"));  强转一个函数指针
NSObject *(*) // 函数的指针
(id, SEL) // 参数
(void *) // id
objc_msgSend // 函数
(objc_getClass("NSObject") // 函数
[NSObject alloc]  ===== objc_msgSend(objc_getClass("NSObject"), sel_registerName("alloc"));  // 发送消息
[objc init]       ===== objc_msgSend((id)objc, sel_registerName("init")) // 发送消息
sel_registerName 注册了一个方法名字

id objc = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc"));
objc = ((id (*)(id, SEL))(void *)objc_msgSend)((id)objc, sel_registerName("init"));


使用终端获取查看最终生成代码





---objc

#####二、练习

Xcode6之前,苹果允许使用objc_msgSend,而且有参数提示,Xcode6 苹果不推荐我们使用runtime

######我们在使用Xcode6之后的版本需要设置 编译器 不严格检查消息机制

// Xcode6 苹果不推荐我们使用runtime
// 找到 build settings -> 搜索 msg


#pragma 使用runtime 创建一个初始化一个对象
/*
官方的最终代码 可以模仿
id objc = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc"));
objc = ((id (*)(id, SEL))(void *)objc_msgSend)((id)objc, sel_registerName("init"));
*/

// objc_msgSend()
//重点  ---- ((NSObject *(*)(id, SEL))(void *)objc_msgSend)() 函数类型  错误: too few arguments to function call, expected 2 ,have 0 : 缺少2个参数 (id, SEL)
// 类的方法的本质 : 类对象 调用[NSObject class]
// id : 谁发送消息
// SEL : 发送什么消息
// [NSObject class]

// Xcode6之前,苹果允许使用objc_msgSend,而且有参数提示
// Xcode6 苹果不推荐我们使用runtime
// 找到 build settings -> 搜索 msg
// enable strict checking of objc_msgSend Claas 严格检查消息机制 (设置为No,那么使用消息机制 就会有参数提示)
//    id objc = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)([NSObject class],@selector(alloc));//expected ':' after expression : 缺少分号
//    id objc = objc_msgSend(<#id self#>, <#SEL op, ...#>)
id objc = objc_msgSend([NSObject class], @selector(alloc));
// objc = [objc init];
objc = objc_msgSend(objc, @selector(init));




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Objective-C RunTime