Oc 编译错误、符号与链接、加载

 在Objective-C中,由于方法调用都是在运行期确定的,因此没有针对方法的symbol,只有针对类的。

Oc 编译错误、符号与链接、加载

oc 语言只在编译时进行符号声明存在检查,不存在链接阶段的解析

No visible @interface for ‘xxxx’ declares the selector 'hello'

 

除了提供在其他面向对象语言中已有的多数抽象和机制之外,Objective-C 还是一种非常动态的程序设计语言,而且这种动态是其最大优势。这种动态体现在它允许在运行应用程序时(即运行时)才去确定其行为,而不是在生成期间就已固定下来。因此,Objective-C 的动态机制让程序免受约束(编译和链接程序时施加的约束);进而在用户控制下,将大多数符号解析责任转移到运行时。

https://developer.apple.com/library/archive/referencelibrary/GettingStarted/RoadMapiOSCh-Legacy/chapters/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

 

-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。

 

在Xcode工程的Other linker flags中添加-ObjC 标志可以解决使用静态库中的category时出现unrecognized selector的问题。

 

UNIX的静态库(xxx.a)其实就是一个目标文件(xxx.o)的集合。在C语言中,编译一个源文件时如果遇到在其他文件中定义的函数,则会留下一个 undefined symbol。在链接时会通过找到其他文件中的定义来确定这个symbol。

 

在Objective-C中,由于方法调用都是在运行期确定的,因此没有针对方法的symbol,只有针对类的。

 

这样在静态库中如果使用了category扩展已有的类,编译器不知道如何将category和已有的类整合在一起,就会导致unrecognized selector问题。添加-ObjC标志后,编译器会把一个类相关的所有目标文件都加载,这样就解决了这个问题。但是由于这样做会使可执行文件体积变大,所以没有设为默认选项。

————————————————

版权声明:本文为CSDN博主「Lonely_Devil」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Lonely_Devil/article/details/50907781

 

posted @ 2021-06-05 12:47  zzfx  阅读(224)  评论(0编辑  收藏  举报