kingcos / kingcos.github.io

kingcos.me
https://kingcos.me
2 stars 0 forks source link

posts/2019/+load_in_ios/ #7

Open utterances-bot opened 5 years ago

utterances-bot commented 5 years ago

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/

manWithnoFace commented 5 years ago

楼主写的好详细,可是看完也无法解决我的问题。。swift 4 以后怎么去调用oc的category中的+load方法呢

kingcos commented 5 years ago

@manWithnoFace

感谢您的提问!您是指在 Swift 混编项目中,Swift 代码中主动调用 Obj-C 类的 +load 方法时(比如 Foo.load()),怎样才能调用到 Category 中 +load 对吗?

如果您的问题是这样的话,其实无论 Swift 还是 Obj-C 中类似 Foo.load() 的主动调用都是走的消息发送机制(详见《浅尝 objc_msgSend》),其一定会努力找到最后参与编译的 Category 中的方法进行响应。如果我对问题的理解有误,麻烦您能补充点细节就更好啦~

manWithnoFace commented 5 years ago

抱歉,这么久才回复。可能是我的描述不够清楚。

我现在有一个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.

kingcos commented 5 years ago

@manWithnoFace

根据您说的,我在本地也建立项目和 framework 试了下:

为 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 呢?

sweetday commented 3 years ago

nice