Open utterances-bot opened 5 years ago
楼主写的好详细,可是看完也无法解决我的问题。。swift 4 以后怎么去调用oc的category中的+load方法呢
@manWithnoFace
感谢您的提问!您是指在 Swift 混编项目中,Swift 代码中主动调用 Obj-C 类的 +load
方法时(比如 Foo.load()
),怎样才能调用到 Category 中 +load
对吗?
如果您的问题是这样的话,其实无论 Swift 还是 Obj-C 中类似 Foo.load()
的主动调用都是走的消息发送机制(详见《浅尝 objc_msgSend》),其一定会努力找到最后参与编译的 Category 中的方法进行响应。如果我对问题的理解有误,麻烦您能补充点细节就更好啦~
抱歉,这么久才回复。可能是我的描述不够清楚。
我现在有一个framework或者.a ,其中包含了 oc语言的Category,比如:UIApplication,假如再Category 中 实现了 +load 方法,并做了一些事情。
现在新建一个swift 项目,当把framework或者.a加入工程后,并不会调用UIApplication + Category 中的+load方法。(Other link flag 已经加入 -ObjC)
我不知道如何去解决这个问题
------------------ 原始邮件 ------------------ 发件人: "kingcos"notifications@github.com; 发送时间: 2019年8月25日(星期天) 晚上10:23 收件人: "kingcos/kingcos.github.io"kingcos.github.io@noreply.github.com; 抄送: "iOS开发E-屋面人"2013830429@qq.com;"Mention"mention@noreply.github.com; 主题: Re: [kingcos/kingcos.github.io] posts/2019/+load_in_ios/ (#7)
@manWithnoFace
感谢您的提问!您是指在 Swift 混编项目中,Swift 代码中主动调用 Obj-C 类的 +load 方法时(比如 Foo.load()),怎样才能调用到 Category 中 +load 对吗?
如果您的问题是这样的话,其实无论 Swift 还是 Obj-C 中类似 Foo.load() 的主动调用都是走的消息发送机制(详见《浅尝 objc_msgSend》),其一定会努力找到最后参与编译的 Category 中的方法进行响应。如果我对问题的理解有误,麻烦您能补充点细节就更好啦~
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or mute the thread.
@manWithnoFace
根据您说的,我在本地也建立项目和 framework 试了下:
Mach-O Type
为静态库(Static Framework)时,拖入 Swift 项目中默认确实是不会调用到库中的 +load;而拖入 Obj-C 项目就没问题。为 scheme 加入 OBJC_PRINT_LOAD_METHODS
环境变量也能印证静态库中的 +load 根本没有被加载。而 Obj-C 项目的 Other Linker Flags
是默认带有 -ObjC
的,而 Swift 项目默认没有,但手动加入 -ObjC
后,是可以正常加载到静态库中的 +load 的(反之删除 Obj-C 项目的 -ObjC
则也无法加载到 +load):
根据这种现象,这应当是由于 Other Linker Flags
对于静态库链接相关的作用与影响。非常感谢您的提出,这部分我会尝试补充在本文中;但您提到的即使加入了链接器参数 -ObjC
仍无法调用到 +load 的问题确实有点奇怪,是否可以分享一个 Demo Project 呢?
nice
iOS 中的 +load 方法 :: iBlog
Date Notes Source Code Demo 2019-04-20 首次提交 objc4-750 Load_Obj-C_Demo Preface 在 iOS 开发中,我们经常会使用 +load 方法来做一些在 main 函数之前的操作,比如方法交换(Method Swizzle)等。那么 +load 到底是如何被调用的呢? What // NSObject.h @interface NSObject <NSObject> { + (void)load; } Obj-C 中的 +load 方法指的是 NSObject 中的 + (void)load 类方法。官方文档中的 +load 如下: Invoked whenever a class or category is added to the Objective-C runtime; implement this method to perform class-specific behavior upon loading.
https://maimieng.com/posts/2019/+load_in_ios/