作者: | 来源:互联网 | 2023-09-12 14:36
Oc编译错误、符号与链接、加载oc语言只在编译时进行符号声明存在检查,不存在链接阶段的解析Novisible@interfacefor‘xxxx’declarestheselec
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