如何从Apple提供的源代码c语言编译器源代码objc runtime

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&经常看见某些大牛关于objc runtime的文章,感觉很厉害,所以也想玩一下objc runtime。&br&&br&我们可以从 &a href=&///?target=http%3A//www./tarballs/objc4/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Source Browser&i class=&icon-external&&&/i&&/a& 下载objc4源代码。我用xcode尝试编译了一下,报错,缺少各种头文件,我Google了这些头文件,并把它们放到/tmp/objc.dst/usr/include中,还是报错,比如语法错误等。&br&&br&实在不知道如何是好,请问各位研究过runtime的大牛:&br&1. 如何从Apple提供的源代码编译objc runtime?&br&2. 编译完成以后,应该会得到一个libobjc.A.dylib,如何使用这个dylib(代替系统的libobjc.A.dylib)?&br&&br&如果你也想研究runtime,是否有兴趣自己编译一下,并且把你的经验分享一下呢?&br&如果你也想知道答案,是否可以帮忙点击一下下面的「&b&邀请回答&/b&」,请大牛来解惑呢?&br&&br&这个问题我在stackoverflow上也有提问,链接:&a class=& wrap external& href=&///?target=http%3A///questions//how-to-compile-and-use-objc-runtime-from-apples-source-code& target=&_blank& rel=&nofollow noreferrer&&ios - how to compile and use objc runtime from apple's source code?&i class=&icon-external&&&/i&&/a&&br&&br&----------------update -------------&br&既然各位大神都来了,就再补充提问一下(题主小菜,大神不要笑话啊):&br&1. libobjc.A.dylib到底有什么用?和Objective-C这门语言到底有什么关系?&br&2. Apple提供的objc4源代码根目录下有objc.sln,是否说明Apple把objc编译到了windows平台?我们是否也可以用objc开发windows应用呢?&br&&br&比如下面的代码 test.m :&br&&div class=&highlight&&&pre&&code class=&language-objective-c&&&span class=&cp&&#import &Foundation/Foundation.h&&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&argc&/span&&span class=&p&&,&/span&&span class=&k&&const&/span& &span class=&kt&&char&/span& &span class=&o&&*&/span&&span class=&n&&argv&/span&&span class=&p&&[]){&/span&
&span class=&n&&NSLog&/span&&span class=&p&&(&/span&&span class=&s&&@&hello %@&&/span&&span class=&p&&,&/span&&span class=&s&&@&world&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&运行:&div class=&highlight&&&pre&&code class=&language-bash&&gcc -ObjC -framework Foundation test.m &span class=&o&&&&&/span& otool -L a.out
&/code&&/pre&&/div&输出:&br&&div class=&highlight&&&pre&&code class=&language-text&&/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version )
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version )
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version )
&/code&&/pre&&/div&这个时候,&b&没有libobjc.A.dylib&/b&&br&&br&但是,如果我们修改一下test.m:&br&&div class=&highlight&&&pre&&code class=&language-objective-c&&&span class=&cp&&#import &Foundation/Foundation.h&&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&argc&/span&&span class=&p&&,&/span&&span class=&k&&const&/span& &span class=&kt&&char&/span& &span class=&o&&*&/span&&span class=&n&&argv&/span&&span class=&p&&[]){&/span&
&span class=&n&&NSLog&/span&&span class=&p&&(&/span&&span class=&s&&@&hello %@&&/span&&span class=&p&&,[&/span&&span class=&bp&&NSString&/span& &span class=&nl&&stringWithFormat&/span&&span class=&p&&:&/span&&span class=&s&&@&world&&/span&&span class=&p&&]);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&再运行:&br&&div class=&highlight&&&pre&&code class=&language-bash&&gcc -ObjC -framework Foundation test.m &span class=&o&&&&&/span& otool -L a.out
&/code&&/pre&&/div&这时候输出:&br&&div class=&highlight&&&pre&&code class=&language-bash&&/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation &span class=&o&&(&/span&compatibility version 300.0.0, current version &span class=&o&&)&/span&
/usr/lib/libSystem.B.dylib &span class=&o&&(&/span&compatibility version 1.0.0, current version &span class=&o&&)&/span&
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation &span class=&o&&(&/span&compatibility version 150.0.0, current version &span class=&o&&)&/span&
/usr/lib/libobjc.A.dylib &span class=&o&&(&/span&compatibility version 1.0.0, current version 228.0.0&span class=&o&&)&/span&
&/code&&/pre&&/div&/usr/lib/libobjc.A.dylib为什么被引用了?&br&&br&&br&我在xp虚拟机上安装了iTunes,打开目录:C:\Program Files\Common Files\Apple\Apple Application Support&br&&img data-rawheight=&618& data-rawwidth=&821& src=&/7897ea4fae49e87877d4dbf21d176b1c_b.jpg& class=&origin_image zh-lightbox-thumb& width=&821& data-original=&/7897ea4fae49e87877d4dbf21d176b1c_r.jpg&&我们看到objc对应的framework,在这里都成了dll,包括objc.dll。这些东西有什么用,iTunes会不会是用objc写的呢?&br&&br&问题比较多,但是都是关于objc runtime的。表达能力不好,您能看完问题,我已经很开心了。如果您能对其中任何一个问题给我提供任何线索,我都将非常感激!!!&br&另外,我会把我学到的一切关于runtime的知识都分享到我自己的博客上,大家可以在这里查阅:&br&&a href=&///?target=http%3A//www.gfzj.us/tech//objc-runtime-compile-from-source-code.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&从源代码编译objc runtime&i class=&icon-external&&&/i&&/a&
经常看见某些大牛关于objc runtime的文章,感觉很厉害,所以也想玩一下objc runtime。我们可以从
下载objc4源代码。我用xcode尝试编译了一下,报错,缺少各种头文件,我Google了这些头文件,并把它们放到/tmp/objc.dst/usr/include中,还是报错,比如语法错误等。实在不知道如何是好,请问各位研究过runtime的大牛:1. 如何从Apple提供的源代码编译objc runtime?2. 编译完成以后,应该会得到一个libobjc.A.dylib,如何使用这个dylib(代替系统的libobjc.A.dylib)?如果你也想研究runtime,是否有兴趣自己编译一下,并且把你的经验分享一下呢?如果你也想知道答案,是否可以帮忙点击一下下面的「邀请回答」,请大牛来解惑呢?这个问题我在stackoverflow上也有提问,链接:----------------update -------------既然各位大神都来了,就再补充提问一下(题主小菜,大神不要笑话啊):1. libobjc.A.dylib到底有什么用?和Objective-C这门语言到底有什么关系?2. Apple提供的objc4源代码根目录下有objc.sln,是否说明Apple把objc编译到了windows平台?我们是否也可以用objc开发windows应用呢?…
没玩过,以前是看GNU的那套源码。关注一下,看看有没有朋友成功。
坑占了确实略久(最近太忙, 只看不发)...... 不过评论里的一位同学说是一个长篇回答肯定不至于, 只是做了补漏工作, 把所有缺失的私有文件全部按照对应要求放到include下, 改改工程设置就算大功告成了, 由于我只在OSX下编译过, 又不接触微软系列所以没法帮题主具体在瘟都死下编译了, 如果题主不介意可以去我github上下 已经传上去了, 可以自行比对,
请猛戳 &a href=&///?target=https%3A///RetVal/objc4-532.2& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RetVal/objc4-532.2 · GitHub&i class=&icon-external&&&/i&&/a&.&br&&br&顺便回答小问题:&br&&br&1. 是语言的运行时, 没有这个objc代码编译完基本不可能跑不起来.&br&&br&2. 是可以的, 不然瘟都死下的iTunes里的那堆东西是什么, 基本可以认为是原封不动的带着依赖过来的. 是不是能让我们来开发呢, 也是可以的, 不过对于苹果外围的第三方开发人员来说, 非常麻烦, 因为缺失各种文件和编程环境, 开发前期预备工作比你项目本身还多, 得不偿失.&br&&br&3. @&& 这个会创建一个NSString(这是废话, 但又不是), 严格意义上是__NSConstantString, 由编译器和runtime一个约定的结构体, 用来描述字符串常量对象, 我扯了这么多就是为了说明由@&&定义的NSString是静态的, 编译期完全决定完毕, 所以第一个版本的test.m和printf(&xxxx&);没有什么区别.&br&而后面的test.m产生了消息发送(一般是用函数调用, 方法调用来说, 不过本人不是很喜欢这种掩盖objc特性的说法), 消息发送必然会走runtime做派发, 所以看1就懂了.&br&&br&4.最后一问在2里就基本说明了.&br&&br&先发图占坑...&br&&img src=&/3e0b1fbed73eb_b.jpg& data-rawwidth=&468& data-rawheight=&488& class=&origin_image zh-lightbox-thumb& width=&468& data-original=&/3e0b1fbed73eb_r.jpg&&
坑占了确实略久(最近太忙, 只看不发)...... 不过评论里的一位同学说是一个长篇回答肯定不至于, 只是做了补漏工作, 把所有缺失的私有文件全部按照对应要求放到include下, 改改工程设置就算大功告成了, 由于我只在OSX下编译过, 又不接触微软系列所以没法帮题…
已有帐号?
无法登录?
社交帐号登录如何从Apple提供的源代码编译objc runtime?
经常看见某些大牛关于objc runtime的文章,感觉很厉害,所以也想玩一下objc runtime。&br&&br&我们可以从 &a href=&///?target=http%3A//www./tarballs/objc4/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Source Browser&i class=&icon-external&&&/i&&/a& 下载objc4源代码。我用xcode尝试编译了一下,报错,缺少各种头文件,我Google了这些头文件,并把它们放到/tmp/objc.dst/usr/include中,还是报错,比如语法错误等。&br&&br&实在不知道如何是好,请问各位研究过runtime的大牛:&br&1. 如何从Apple提供的源代码编译objc runtime?&br&2. 编译完成以后,应该会得到一个libobjc.A.dylib,如何使用这个dylib(代替系统的libobjc.A.dylib)?&br&&br&如果你也想研究runtime,是否有兴趣自己编译一下,并且把你的经验分享一下呢?&br&如果你也想知道答案,是否可以帮忙点击一下下面的「&b&邀请回答&/b&」,请大牛来解惑呢?&br&&br&这个问题我在stackoverflow上也有提问,链接:&a class=& wrap external& href=&///?target=http%3A///questions//how-to-compile-and-use-objc-runtime-from-apples-source-code& target=&_blank& rel=&nofollow noreferrer&&ios - how to compile and use objc runtime from apple's source code?&i class=&icon-external&&&/i&&/a&&br&&br&----------------update -------------&br&既然各位大神都来了,就再补充提问一下(题主小菜,大神不要笑话啊):&br&1. libobjc.A.dylib到底有什么用?和Objective-C这门语言到底有什么关系?&br&2. Apple提供的objc4源代码根目录下有objc.sln,是否说明Apple把objc编译到了windows平台?我们是否也可以用objc开发windows应用呢?&br&&br&比如下面的代码 test.m :&br&&div class=&highlight&&&pre&&code class=&language-objective-c&&&span class=&cp&&#import &Foundation/Foundation.h&&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&argc&/span&&span class=&p&&,&/span&&span class=&k&&const&/span& &span class=&kt&&char&/span& &span class=&o&&*&/span&&span class=&n&&argv&/span&&span class=&p&&[]){&/span&
&span class=&n&&NSLog&/span&&span class=&p&&(&/span&&span class=&s&&@&hello %@&&/span&&span class=&p&&,&/span&&span class=&s&&@&world&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&运行:&div class=&highlight&&&pre&&code class=&language-bash&&gcc -ObjC -framework Foundation test.m &span class=&o&&&&&/span& otool -L a.out
&/code&&/pre&&/div&输出:&br&&div class=&highlight&&&pre&&code class=&language-text&&/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version )
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version )
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version )
&/code&&/pre&&/div&这个时候,&b&没有libobjc.A.dylib&/b&&br&&br&但是,如果我们修改一下test.m:&br&&div class=&highlight&&&pre&&code class=&language-objective-c&&&span class=&cp&&#import &Foundation/Foundation.h&&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&argc&/span&&span class=&p&&,&/span&&span class=&k&&const&/span& &span class=&kt&&char&/span& &span class=&o&&*&/span&&span class=&n&&argv&/span&&span class=&p&&[]){&/span&
&span class=&n&&NSLog&/span&&span class=&p&&(&/span&&span class=&s&&@&hello %@&&/span&&span class=&p&&,[&/span&&span class=&bp&&NSString&/span& &span class=&nl&&stringWithFormat&/span&&span class=&p&&:&/span&&span class=&s&&@&world&&/span&&span class=&p&&]);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&再运行:&br&&div class=&highlight&&&pre&&code class=&language-bash&&gcc -ObjC -framework Foundation test.m &span class=&o&&&&&/span& otool -L a.out
&/code&&/pre&&/div&这时候输出:&br&&div class=&highlight&&&pre&&code class=&language-bash&&/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation &span class=&o&&(&/span&compatibility version 300.0.0, current version &span class=&o&&)&/span&
/usr/lib/libSystem.B.dylib &span class=&o&&(&/span&compatibility version 1.0.0, current version &span class=&o&&)&/span&
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation &span class=&o&&(&/span&compatibility version 150.0.0, current version &span class=&o&&)&/span&
/usr/lib/libobjc.A.dylib &span class=&o&&(&/span&compatibility version 1.0.0, current version 228.0.0&span class=&o&&)&/span&
&/code&&/pre&&/div&/usr/lib/libobjc.A.dylib为什么被引用了?&br&&br&&br&我在xp虚拟机上安装了iTunes,打开目录:C:\Program Files\Common Files\Apple\Apple Application Support&br&&img data-rawheight=&618& data-rawwidth=&821& src=&/7897ea4fae49e87877d4dbf21d176b1c_b.jpg& class=&origin_image zh-lightbox-thumb& width=&821& data-original=&/7897ea4fae49e87877d4dbf21d176b1c_r.jpg&&我们看到objc对应的framework,在这里都成了dll,包括objc.dll。这些东西有什么用,iTunes会不会是用objc写的呢?&br&&br&问题比较多,但是都是关于objc runtime的。表达能力不好,您能看完问题,我已经很开心了。如果您能对其中任何一个问题给我提供任何线索,我都将非常感激!!!&br&另外,我会把我学到的一切关于runtime的知识都分享到我自己的博客上,大家可以在这里查阅:&br&&a href=&///?target=http%3A//www.gfzj.us/tech//objc-runtime-compile-from-source-code.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&从源代码编译objc runtime&i class=&icon-external&&&/i&&/a&
经常看见某些大牛关于objc runtime的文章,感觉很厉害,所以也想玩一下objc runtime。我们可以从
下载objc4源代码。我用xcode尝试编译了一下,报错,缺少各种头文件,我Google了这些头文件,并把它们放到/tmp/objc.dst/usr/include中,还是报错,比如语法错误等。实在不知道如何是好,请问各位研究过runtime的大牛:1. 如何从Apple提供的源代码编译objc runtime?2. 编译完成以后,应该会得到一个libobjc.A.dylib,如何使用这个dylib(代替系统的libobjc.A.dylib)?如果你也想研究runtime,是否有兴趣自己编译一下,并且把你的经验分享一下呢?如果你也想知道答案,是否可以帮忙点击一下下面的「邀请回答」,请大牛来解惑呢?这个问题我在stackoverflow上也有提问,链接:----------------update -------------既然各位大神都来了,就再补充提问一下(题主小菜,大神不要笑话啊):1. libobjc.A.dylib到底有什么用?和Objective-C这门语言到底有什么关系?2. Apple提供的objc4源代码根目录下有objc.sln,是否说明Apple把objc编译到了windows平台?我们是否也可以用objc开发windows应用呢?…
按投票排序
坑占了确实略久(最近太忙, 只看不发)...... 不过评论里的一位同学说是一个长篇回答肯定不至于, 只是做了补漏工作, 把所有缺失的私有文件全部按照对应要求放到include下, 改改工程设置就算大功告成了, 由于我只在OSX下编译过, 又不接触微软系列所以没法帮题主具体在瘟都死下编译了, 如果题主不介意可以去我github上下 已经传上去了, 可以自行比对,
请猛戳 .顺便回答小问题:1. 是语言的运行时, 没有这个objc代码编译完基本不可能跑不起来.2. 是可以的, 不然瘟都死下的iTunes里的那堆东西是什么, 基本可以认为是原封不动的带着依赖过来的. 是不是能让我们来开发呢, 也是可以的, 不过对于苹果外围的第三方开发人员来说, 非常麻烦, 因为缺失各种文件和编程环境, 开发前期预备工作比你项目本身还多, 得不偿失.3. @"" 这个会创建一个NSString(这是废话, 但又不是), 严格意义上是__NSConstantString, 由编译器和runtime一个约定的结构体, 用来描述字符串常量对象, 我扯了这么多就是为了说明由@""定义的NSString是静态的, 编译期完全决定完毕, 所以第一个版本的test.m和printf("xxxx");没有什么区别.而后面的test.m产生了消息发送(一般是用函数调用, 方法调用来说, 不过本人不是很喜欢这种掩盖objc特性的说法), 消息发送必然会走runtime做派发, 所以看1就懂了.4.最后一问在2里就基本说明了.先发图占坑...
没玩过,以前是看GNU的那套源码。关注一下,看看有没有朋友成功。
替换的话应该可以用 LD_PRELOAD
怎样把obj编译到安卓
有个视频,讲了几个开源项目
已有帐号?
无法登录?
社交帐号登录ios runtime基础知识 - 推酷
ios runtime基础知识
学习 Objective-C 的运行时 Runtime 系统是很有必要的。个人觉得,得之可得天下,失之则失天下。
Objective-C 提供了编译运行时,只要有可能,它都可以动态地运作。这意味着不仅需要编译器,还需要运行时系统执行编译的代码。运行时系统充当 Objective-C 语言的操作系统,有了它才能运作。
运行时系统所提供功能是非常强大的,在实际开发中是经常使用到的。比如,苹果不允许我们给 Category 追加扩展属性,是因为它不会自动生成成员变量,那么我们通过运行时就可以很好的解决这个问题。另外,常见的模型转字典或者字典转模型,对象归档等。后续我们再来学习如何应用,本节只是讲讲理论。
与Runtime交互
Objective-C 程序有有三种与 runtime 系统交互的级别:
通过 Objective-C 源代码
通过 Foundation 库中定义的 NSObject 提供的方法
通过直接调用 runtime 方法
通过Objective-C源代码
在大多数的部分,运行时系统会自动运行并在后台运行。我们使用它只是写源代码并编译源代码。当编译包含 Objective-C 类和方法的代码时,编译器会创建实现了语言动态特性的数据结构和函数调用。该数据结构捕获在类、扩展和协议中所定义的信息。
最重要的 runtime 函数是发消息函数,在编译时,编译器会转换成类似 objc_msgSend 这样的发送消息的函数。因此,我们通过写好源代码,编译器会自动帮助我们编译成 runtime 代码。
通过NSObject提供的方法
在 Cocoa 编程中,大部分的类都继承于 NSObject ,也就是说 NSObject 通常是根类,大部分的类都继承于 NSObject 。有些特殊的情况下, NSObject 只是提供了它应该要做什么的模板,却没有提供所有必须的代码。
有些 NSObject 提供的方法仅仅是为了查询运动时系统的相关信息,这此方法都可以反查自己。比如 -isKindOfClass: 和 -isMemberOfClass: 都是用于查询在继承体系中的位置。 -respondsToSelector: 指明是否接受特定的消息。 +conformsToProtocol: 指明是否要求实现在指定的协议中声明的方法。 -methodForSelector: 提供方法实现的地址。
通过直接调用runtime函数
runtime 库函数在 usr/include/objc 目录下,我们主要关注是这两个头文件:
#import &objc/runtime.h&
#import &objc/objc.h&
关于如何使用,后续的文章再细细讲解。
消息(Message)
为什么叫消息呢?因为面向对象编程中,对象调用方法叫做发送消息。在编译时,应用的源代码就会被编将对象发送消息转换成 runtime 的 objc_msgSend 函数调用。
在 Objective-C ,消息在运行时并不要求实现。编译器会转换消息表达式:
[receivermessage];
在编译时会转换成类似这样的函数调用:
objc_msgSend(receiver, selector);
具体会转换成哪个,我们来看看官方的原话:
When itencounters a methodcall, thecompilergenerates a calltooneofthe
*&&functions \c objc_msgSend, \c objc_msgSend_stret, \c objc_msgSendSuper, or \c objc_msgSendSuper_stret.
*&&Messages senttoanobject’s superclass (usingthe \c super keyword) aresentusing \c objc_msgSendS
*&&othermessagesaresentusing \c objc_msgSend. Methods thathavedatastructuresasreturn values
*&&aresentusing \c objc_msgSendSuper_stretand \c objc_msgSend_stret.
也就是说,我们是通过编译器来自动转换成运行时代码时,它会根据类型自动转换成下面的其它一个函数:
objc_msgSend:其它普通的消息都会通过该函数来发送
objc msgSend stret:消息中需要有数据结构作为返回值时,会通过该函数来发送消息并接收返回值
objc msgSendSuper:与objc msgSend函数类似,只是它把消息发送给父类实例
objc msgSendSuper stret:与objc msgSend stret函数类似,只是它把消息发送给父类实例并接收数组结构作为返回值
另外,如果函数返回值是浮点类型,官方说明如下:
* arm:&&&&objc_msgSend_fpret notused
* i386:&& objc_msgSend_fpret usedfor `float`, `double`, `long double`.
* x86-64: objc_msgSend_fpret usedfor `long double`.
* arm:&&&&objc_msgSend_fp2ret notused
* i386:&& objc_msgSend_fp2ret notused
* x86-64: objc_msgSend_fp2ret usedfor `_Complex long double`.
其实这是一个条件编译,我们不用担心是哪种处理器上,我们只需要调用 objc_msgSend_fpret 函数即可。
当消息被发送到实例对象时,它是如何处理的:
我们的根类是 NSObject ,它会一层一层的传递,直接找到要处理该消息的对象,若都没有找到,正常情况下会出现 Unreconized selector ... 这样的崩溃提示了。
Message Forwarding
当发送消息给一个不处理该消息的对象是错误的。然后在宣布错误之前,运行时系统给了接收消息的对象处理消息的第二个机会。
当某对象不处理某消息时,可以通过重写 -forwardInvocation: 方法来提供一个默认的消息响应或者避免出错。当对象中找不到方法实现时,会按照类继承关系一层层往上找。我们看看类继承关系图:
所有元类中的 isa 指针都指向根元类,而根元类的 isa 指针则指向自身。根元类是继承于根类的,与根类的结构体成员一致,都是 objc_class 结构体,不同的是根元类的 isa 指针指向自身,而根类的 isa 指针为 nil
我们再看看消息处理流程:
当对象查询不到相关的方法,消息得不到该对象处理,会启动“消息转发”机制。消息转发还分为几个阶段:先询问 receiver 或者说是它所属的类是否能动态添加方法,以处理当前这个消息,这叫做“动态方法解析”,runtime会通过 +resolveInstanceMethod: 判断能否处理。如果runtime完成动态添加方法的询问之后, receiver 仍然无法正常响应则Runtime会继续向receiver询问是否有其它对象即其它receiver能处理这条消息,若返回能够处理的对象,Runtime会把消息转给返回的对象,消息转发流程也就结束。若无对象返回,Runtime会把消息有关的全部细节都封装到 NSInvocation 对象中,再给 receiver 最后一次机会,令其设法解决当前还未处理的这条消息。
消息处理越往后,开销也就会越大,因此最好直接在第一步就可以得到消息处理。
我们看看类结构体:
struct objc_class {
&&&&Class isa&&OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
&&&&Class super_class&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&OBJC2_UNAVAILABLE;
&&&&const char *name&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&OBJC2_UNAVAILABLE;
&&&&long version&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&OBJC2_UNAVAILABLE;
&&&&long info&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&OBJC2_UNAVAILABLE;
&&&&long instance_size&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&OBJC2_UNAVAILABLE;
&&&&struct objc_ivar_list*ivars&&&&&&&&&&&&&&&&&&&&&&&&&&&&OBJC2_UNAVAILABLE;
&&&&struct objc_method_list**methodLists&&&&&&&&&&&&&&&&&&&&OBJC2_UNAVAILABLE;
&&&&struct objc_cache*cache&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&OBJC2_UNAVAILABLE;
&&&&struct objc_protocol_list*protocols&&&&&&&&&&&&&&&&&&&&OBJC2_UNAVAILABLE;
} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */
我们可以看到每个类结构体都会有一个 isa 指针,它是指向元类的。它还有一个父类指针 super_class ,指针父类。包含了类的名称 name 、类的版本信息 version 、类的一些标识信息 info 、实例大小 instance_size 、成员变量地址列表 ivars 、方法地址列表 methodLists 、缓存最近使用的方法地址 cache 、协议列表protocols`。
我们在使用时,经常使用到 Class ,它就是:
typedef struct objc_class*C
当类为根类时,它的 super_class 就会是 nil 。普通的 Class 存储的是实例成员,如 - 号方法、属性、成员变量,而 isa 则指向元类,而元类存储的是静态成员,如 + 号方法、 static 成员。
Type Encoding
代表char类型
代表int类型
代表short类型
代表long类型,在64位处理器上也是按照32位处理
代表long long类型
代表unsigned char类型
代表unsigned int类型
代表unsigned short类型
代表unsigned long类型
代表unsigned long long类型
代表float类型
代表double类型
代表C++中的bool或者C99中的_Bool
代表void类型
代表char *类型
代表对象类型
代表类对象 (Class)
代表方法selector (SEL)
[array type]
{name=type…}
代表结构体
(name=type…)
A bit field of num bits
A pointer to type
An unknown type (among other things, this code is used for function pointers)
我们想要通过运行时处理各种类型,那么我们必须要知道哪种字符代表什么类型。
理论知识就写这么多吧,这篇文章只是讲讲一些比较基础的知识点,为后面的学习奠定基础。如果文章中出现有疑问的地方,请在评论中评论,笔者会在第一时间回复您的!
如果在使用过程中遇到问题,或者想要与我交流,可加入有问必答
关注微信公众号:
关注新浪微博账号:标哥Jacky
支持并捐助
如果您觉得文章对您很有帮忙,希望得到您的支持。您的捐肋将会给予我最大的鼓励,感谢您的支持!
支付宝捐助
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 objc runtime.h 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信