聊聊 "-ObjC" 的故事

"民之失德,乾糇以愆;他山之石,可以攻玉。" - 《诗经》
59231e018c9849a18ff763c16a895ff6.png?imageView

在开发 iOS 应用时,可能遇见这样的情况:你想实现的某种功能(比如崩溃收集),已经有成熟的产品提供,可行的方案就是集成这个使用了很久,且有专业人员维护,最重要的是“免费”的产品。一番折腾之后,运行时有可能出现"selector not recognized"错误,最后发现是少了如下的配置(Build Settings -> "-ObjC"):

45eed87171c24ca8a3d38bfe93495274.png?imageView

那么这个"–ObjC" 到底是个什么鬼? 我们来扒一扒。

"-ObjC" 的使用场景

据坊间说:如果你集成了有 category 的静态库,有可能出现上述错误。原因就是:
Technical Q&A QA1490
"An impedance mismatch between UNIX static libraries and the dynamic nature of Objective-C can cause category methods in static libraries to not be linked into an app, resulting in "selector not recognized" exceptions when the methods aren't found at runtime."

这段话的意思就是:链接器在处理包含Category方法的UNIX的静态库时,没有将Category的方法链接到APP中,造成这个错误。具体的细节在本文的补充部分展开。
可以看出,解决这个错误的方法就是:将Category的方法链接到APP中,这样APP运行时,就能够找到对应的selector。而 –ObjC就可以完成这个任务。"-ObjC"的作用是:将静态库中任何Objective-C代码都链接到APP中。任何Objective-C代码当然也包括Category的方法。可以看出,使用-ObjC可能会链接很多静态库中未被使用的Objective-C代码,极大的增加APP的代码体积。

"-ObjC" 的兄弟

1057ffb2d537461ca85504d05b714f53.png?imageView

和 "-ObjC"作用类似的有以上的五种方案。可以看出,从增加APP代码体积来看,伪符号方案增加得最少"Perform Single-Object Prelink"、 "-force_load" 和 "–ObjC" 次之,"-all_load" 增加得最多。在开发iOS SDK时,为了方便使用者手动集成,最好是减少使用者需要配置的信息,所以"伪符号"方案和 "Perform Single-Object Prelink"方案是推荐的。另外,第三方SDK常常是闭源的,对于使用者来说,伪符号是透明的,所以从简便性角度看,推荐"Perform Single-Object Prelink"方案。

"selector not recognized"错误的产生根源

iOS工程,从源文件到生成最终的APP文件,通常要经过如下步骤:

4cfe51db89774e13868ab3db6f2fe6b2.png?imageView
源文件经过编译和优化后,会生成目标代码。目标代码中包括符号表,标示了此代码中的全局符号和静态符号,还标示了导入符号等,链接器会根据符号表分析各个目标代码之间的调用关系,然后将使用到的代码进行链接和重定位,最后生成可执行文件。在编译Objective-C源文件到目标文件时,编译器并不知道方法的对应实现,只能在运行时才知道,所以编译器只会为类生成链接符号,对类中的方法不会生成链接符号。由于Category方法并不对应一个新类,所以不会生成链接符号,链接器也不会将Category方法合并到原始的类中,最终导致链接器忽略了Category方法,不会将其链接到可执行文件中。

更多资讯请关注查看网易云捕官方博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: objc app架构是一种基于Objective-C语言开发的应用程序架构。在这种架构中,应用程序的主要组成部分是由Objective-C编写的对象,这些对象封装了应用程序的业务逻辑和功能。 在objc app架构中,主要包含以下几个关键的组件: 1. 模型(Model):模型是应用程序的数据和业务逻辑的核心。在objc app架构中,模型通常由Objective-C类实现,用于封装数据和处理相关的业务逻辑。 2. 控制器(Controller):控制器负责协调模型和视图之间的交互。它接收用户的输入,并将其传递给模型进行处理,然后更新视图以显示结果。控制器通常是Objective-C类,用于处理应用程序的逻辑控制和事件处理。 3. 视图(View):视图是应用程序的用户界面的可视化表示。它负责显示模型中的数据,并将用户的输入传递给控制器进行处理。在objc app架构中,视图通常是由UIKit或Cocoa Touch框架提供的界面元素,如按钮、标签、文本框等。 通过以上三个组件的协同工作,objc app架构实现了应用程序的分层架构,将数据、逻辑和界面分离开来,提高了代码的可维护性和复用性。此外,objc app架构还支持面向对象编程的特性,如封装、继承和多态,以及设计模式的使用,如MVC(Model-View-Controller)模式,从而进一步提高了应用程序的开发效率和质量。 总而言之,objc app架构是一种基于Objective-C语言的应用程序架构,通过模型、控制器和视图的协同工作,实现了数据、逻辑和界面的分离,提高了应用程序的可维护性和复用性。 ### 回答2: ObjC App架构是iOS应用开发中的一种常见的架构模式。它由iOS开发者王巍所提出,旨在提供一种清晰、可扩展和易于维护的应用架构。 ObjC App架构的核心思想是将应用分解成相互独立的模块,每个模块负责特定的功能。这些模块之间通过协议和委托进行通信,实现了低耦合和可测试性。常见的模块有View、ViewModel和Model。 View层负责用户界面的展示和用户交互的响应。View层主要由ViewController组成,负责将用户的操作传递给ViewModel,并将ViewModel返回的数据展示给用户。此外,View层还包括了View和ViewModel之间的绑定,实现了双向数据绑定。 ViewModel层是View层和Model层之间的桥梁,负责处理业务逻辑和数据的转换。ViewModel层通常包含了与网络请求、数据解析和数据处理相关的代码。ViewModel将Model层的数据转换成View所需的格式,并将用户的操作转发给Model层。 Model层负责数据的存储和获取。它可以包含网络请求、数据库操作、数据解析等功能。Model层的设计应尽量简单,只关注数据的读写,而不涉及业务逻辑。 通过使用ObjC App架构,我们可以将应用的不同功能模块分解成独立的部件,使得代码更加清晰和易于维护。同时,模块之间低耦合的设计也提高了代码的扩展性和可测试性。此外,ObjC App架构还可以提高多人协作开发的效率,不同团队成员可以专注于各自负责的模块,降低了代码冲突和合并的难度。 总的来说,ObjC App架构是一种优秀的iOS应用架构模式,它通过分解应用的功能模块,提供了清晰、可扩展和易于维护的代码结构。这种架构模式在iOS开发中得到了广泛应用,并为开发者提供了更好的开发体验和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值