静态库中的 Objective-C 类别

2024-03-02

你能指导我如何正确地将静态库链接到 iPhone 项目吗?我使用添加到应用程序项目中的静态库项目作为直接依赖项(目标 - >常规 - >直接依赖项)并且所有工作正常,但类别。静态库中定义的类别在应用程序中不起作用。

所以我的问题是如何将某些类别的静态库添加到其他项目中?

一般来说,在其他项目的应用程序项目代码中使用的最佳实践是什么?


解决方案:从 Xcode 4.2 开始,您只需转到链接库的应用程序(而不是库本身),然后单击项目导航器中的项目,单击应用程序的目标,然后构建设置,然后搜索“其他链接器标志” ”,单击 + 按钮,然后添加“-ObjC”。不再需要“-all_load”和“-force_load”。

Details:我在各种论坛、博客和苹果文档中找到了一些答案。现在我尝试对我的搜索和实验做一个简短的总结。

问题是由(引用自苹果技术问答QA1490)引起的https://developer.apple.com/library/content/qa/qa1490/_index.html https://developer.apple.com/library/content/qa/qa1490/_index.html):

Objective-C 没有定义链接器 每个函数(或方法, 在 Objective-C 中) - 相反,链接器 仅为每个生成符号 班级。如果您延长已有的 带有类别的类,链接器会这样做 不知道关联目标代码 核心类的实现和 类别实施。这 防止在以下位置创建对象 响应产生的申请 到定义在的选择器 类别。

以及他们的解决方案:

为了解决这个问题,静态 库应该传递 -ObjC 选项 到链接器。该标志导致 链接器加载每个目标文件 定义一个库 Objective-C 类或类别。尽管 此选项通常会导致 更大的可执行文件(由于额外的 目标代码加载到 应用程序),它将允许 成功创建有效 Objective-C 静态库 包含现有类别 类。

iPhone开发FAQ中也有推荐:

如何链接所有 Objective-C 静态库中的类?设置 其他链接器标志构建设置为 -ObjC。

和标志说明:

-all_load加载静态归档库的所有成员。

-ObjC加载实现静态归档库的所有成员 Objective-C 类或类别。

-强制加载(存档路径)加载指定静态的所有成员 档案库。注意:-all_load 强制所有档案馆的所有成员 被加载。此选项允许您 定位特定的存档。

*我们可以使用force_load来减少应用程序二进制文件的大小并避免all_load在某些情况下可能导致的冲突。

是的,它适用于添加到项目中的 *.a 文件。 然而,我在将 lib 项目添加为直接依赖项时遇到了麻烦。但后来我发现这是我的错——直接依赖项目可能没有正确添加。当我删除它并再次添加步骤时:

  1. 将 lib 项目文件拖放到应用程序项目中(或使用“项目”->“添加到项目...”添加它)。
  2. 单击 lib 项目图标上的箭头 - 显示 mylib.a 文件名,将此 mylib.a 文件拖放到 Target -> Link Binary With Library 组中。
  3. 在第一页(常规)中打开目标信息并将我的库添加到依赖项列表中

之后一切正常。 “-ObjC”标志对我来说就足够了。

我也对来自的想法感兴趣http://iphonedevelopmentexperiences.blogspot.com/2010/03/categories-in-static-library.html http://iphonedevelopmentexperiences.blogspot.com/2010/03/categories-in-static-library.html博客。作者说他可以使用 lib 中的类别,而无需设置 -all_load 或 -ObjC 标志。他只是将空虚拟类接口/实现添加到类别 h/m 文件中,以强制链接器使用此文件。是的,这个技巧可以做到这一点。

但作者还说他甚至没有实例化虚拟对象。嗯……正如我发现的,我们应该从类别文件中显式调用一些“真实”代码。所以至少应该调用类函数。 我们甚至不需要虚拟类。单个 c 函数执行相同的操作。

因此,如果我们将 lib 文件编写为:

// mylib.h
void useMyLib();

@interface NSObject (Logger)
-(void)logSelf;
@end


// mylib.m
void useMyLib(){
    NSLog(@"do nothing, just for make mylib linked");
}


@implementation NSObject (Logger)
-(void)logSelf{
    NSLog(@"self is:%@", [self description]);
}
@end

如果我们调用 useMyLib(); App项目中的任何地方 那么在任何类中我们都可以使用 logSelf 类别方法;

[self logSelf];

还有更多有关主题的博客:

http://t-machine.org/index.php/2009/10/13/how-to-make-an-iphone-static-library-part-1/ http://t-machine.org/index.php/2009/10/13/how-to-make-an-iphone-static-library-part-1/

http://blog.costan.us/2009/12/fat-iphone-static-libraries-device-and.html http://blog.costan.us/2009/12/fat-iphone-static-libraries-device-and.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态库中的 Objective-C 类别 的相关文章

  • 在 Swift 中使用 commitEditingStyle 动态删除 UITable 部分

    我正在处理一个无法解决的问题 我有一个来自客户数据库数组的名称表 每个客户在其他数据成员中都有一个名称属性 我可以成功删除某个部分中的行 但我不能删除该部分 当该部分中的最后一行被删除时 该部分必须消失 I got NSInternalIn
  • SwiftUI - 预览时未知的预览提供程序“ContentView_Previews_”。发生在一个全新的项目中

    我有这个简单的观点 import SwiftUI struct ContentView View var body some View Text Hello struct ContentView Previews PreviewProvid
  • AppDelegate 的变量用作全局变量不起作用

    我想使用我的 AppDelegate 来存储任何其他类都可以访问的对象 我已经像这样声明了这个 AppDelegate interface MyAppDelegate UIResponder
  • 如何从日期中获取小时、分钟和上午/下午? [复制]

    这个问题在这里已经有答案了 我尝试从日期中提取小时 分钟和上午 下午 但我得到 NULL 输出 我在下面显示了我的代码 请查看 NSString dateStr 29 07 2013 02 00am NSDateFormatter form
  • malloc:***错误:已释放对象的校验和不正确 - 对象可能在释放后被修改

    我的 iOS 应用程序有一个大问题 它有时会崩溃 而没有详细的调试错误 堆栈跟踪为空 这是堆栈跟踪中仅有的两行 UIApplicationMain 中的 符号存根 UIHostedTextServiceSession DismissText
  • iOS 解析如何通过 URL 下载文件

    我正在将 parse 用于我的聊天应用程序 当我上传文件时 我保留该 url 并将该 url 发送给其他用户 然后其他用户可以通过该 URL 下载文件 这是我上传文件的代码 void uploadBlob NSData blob fileN
  • AFNetworking 上传图片

    我看过一些例子 但我认为我的问题可能出在 PHP 中 我正在尝试使用 AFNetworking 将图像从 iPhone 上传到服务器 这是我的 obj c 代码 IBAction uploadButtonClicked id sender
  • 你如何在react-native中实现捏合缩放?

    我一直在研究 PanResponder 我当前的工作假设是 我将检测是否有两个触摸正在向外移动 如果是 则增加元素大小onPanResponderMove功能 这似乎是一种混乱的方法 有没有更顺畅的方法呢 如果您只需要简单的捏缩放功能 只需
  • ios Vision VNImageRequestHandler方向问题

    我正在尝试使用相机通过相机检测脸部VNImageRequestHandler iOS 愿景 当我在横向模式下用相机指向照片时 它会检测到面部 但方向模式相反 let detectFaceRequestHandler VNImageReque
  • UICollectionReusableView 方法未被调用

    我希望我的部分位于UICollectionView有一个带有图像的标题 我已按照以下步骤操作 在故事板中 分配了一个标题作为我的附件UICollectionView 给它一个标识符 创建了一个子类UICollectionReusableVi
  • NSDateFormatter:根据 currentLocale 的日期,不包含年份

    这不会太难吧 我想显示不带年份的日期 例如 8 月 2 日 美国 或 02 08 德国 它也必须适用于许多其他语言环境 到目前为止 我唯一的想法是对年份进行正常格式 然后从生成的字符串中删除年份部分 我认为你需要看一下 NSString d
  • iOS NSURLSession,如何在didCompleteWithError中重试

    我想在我的服务器上尝试一次调用 直到成功为止 我想每 30 秒尝试一次 所以我使用 NSURLSession 进行通话 NSURLSessionDownloadTask task self session downloadTaskWithR
  • 如何获取 UITableView 中的所有单元格

    假设我有一个包含多行的 UITableView 我想在某个时间点将所有 UITableViewCells 作为 NSArray 获取 我努力了 tableView visibleCells 但这种方法有一个问题 我无法拥有当前不在当前屏幕中
  • 我如何从 iPhone 设备获取电子邮件历史记录..?

    friends 我想从我的 iPhone 访问电子邮件历史记录 并且还希望在收到新邮件时收到通知 如果可能的话 请向我提供源代码片段 Thanks 简而言之 使用任何已记录的 API 都是不可能的
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 将捕获的图像精确裁剪为 AVCaptureVideoPreviewLayer 中的外观

    我有一个使用 AV Foundation 的照片应用程序 我使用 AVCaptureVideoPreviewLayer 设置了一个预览层 它占据了屏幕的上半部分 因此 当用户尝试拍照时 他们只能看到屏幕上半部分看到的内容 这很好用 但是当用
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我
  • Objective C (iphone) 关于发布的问题

    如果我创建一个视图 并将其添加为子视图并将其添加到数组中 是否必须释放它两次 UIView cat UIView alloc initWithFrame someFrame self view addSubview cat self ani
  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓
  • 如果加载 dylib,垃圾收集工作队列会崩溃

    我们正在将应用程序从 10 6 移植到 10 8 我正在查看我们在应用程序中加载的 dylib 我面临着非常不寻常的崩溃垃圾收集工作队列并附有以下消息 malloc Thread suspend unable to suspend a th

随机推荐

  • 如何在docker容器崩溃时自动监控并重启?

    我目前正在运行两个虚拟服务器官方鬼魂形象 https registry hub docker com ghost and nginx proxy图片 这是我的构建 docker run d p 86 2368 name home e VIR
  • 碰撞解决:二次探测与单独链接

    好的 我一直在对哈希表和不同的冲突解决问题进行一些实验 我试图找出哪个更有效地进行查找 即使用单独的链接或二次探测来解决冲突的哈希表 我的结果表明 即使对于较小的负载因子 例如 0 4 或 0 2 单独链接也比二次探测更快 是这种情况还是我
  • 支持Android材质设计

    我们正在重新设计我们的 Android 应用程序 考虑到即将推出的 Android L 平台及其材质风格 出现了一个问题 支持旧设备的方式是什么 这种新设计在 4 x 设备上可以接受吗 根据Android Material Design 兼
  • iOS SwiftUI 搜索栏和 REST-API

    我正在尝试使用 SwiftUI 并希望使用搜索字符串从我的 REST API 获取更新 但是 我现在不确定如何将这两个组件组合在一起 我希望你有一个想法 这是我的代码 struct ContentView View State privat
  • 如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作?

    我正在使用 Ruby Mechanize 编写一个 自动填写表格 应用程序 几乎可以用了 我可以用精彩Charles http www charlesproxy com Web 代理来查看服务器和我的 Firefox 浏览器之间的交换 现在
  • 语言环境 JS 的货币代码

    在这里幽默一下 但我有一个简单的任务 即输入数字并将其格式化为货币代码 IE var value 1000 value toLocaleString en AU style currency currency AUD minimumFrac
  • 在heroku python应用程序上使用什么端口

    所以我创建了 2 个 iOS 应用程序 一个发送坐标 一个接收坐标 和一个 python 服务器 其中一个应用程序将 GPS 坐标发送到托管在 heroku 上的 python 服务器 然后 服务器会将收到的 GPS 坐标发送到其他 iOS
  • 如何将 Bot Framework 对话框拆分到不同的文件中

    我试图让我的机器人代码更易于管理 并将一些属于不同文件的对话框放在一起 这里有一个关于 javascript 的古老的类似问题 https github com Microsoft BotBuilder issues 1457 但我正在努力
  • 如何在反应中保存文件输入值

    假设一个页面包含多阶段表单 在表单的第一阶段包含名称的输入字段 在第二阶段包含文件的输入 onChange设置名称和文件的状态值 但是当我们像第一阶段到第二阶段一样来回移动时阶段和第二阶段 我们可以保存输入类型名称的值 但如何保存输入类型文
  • 在Java中:如何让线程监视另一个线程?

    抱歉 如果问题很简单 我是初学者 我必须创建计算某些内容的线程 而第一个线程工作时 另一个线程必须测量第一个线程是否在指定时间内计算函数 如果没有 它必须抛出异常 否则返回答案 我会采用 java util concurrent 组件 简单
  • 在GNU Emacs中,如何按模式设置背景颜色?

    在 GNU Emacs 中 我发现我可以在不同模式下为前景类型设置不同的面孔 例如 custom set faces message header to t foreground LightGoldenrod1 weight bold 如何
  • 在詹金斯上安排每两周一次的工作

    我想在 jenkin 上安排每两周一次的工作 它应该每隔一周星期一运行一次 我无法弄清楚 cron 表达式 我做了一些研究 基本上可以归结为 3 个答案 快速回答 你不能 复杂答案1 您可以在单独的行中手动输入每隔一个星期日的条目 但是当年
  • 在Python中旋转位

    出于好奇 我想看看将对象的 id 转换为其哈希值的操作在字符串域中是什么样子 而不是使用通常的按位操作 例如 class A pass def my hash a bits format id a 064b rot4 bits 4 bits
  • Powershell 无法返回正确的退出代码

    使用以下命令执行 Powershell 脚本 2 0 中 时 File命令行开关 并在 Param 中显式定义输入参数 退出代码始终为 0 永不失败 而不是正确返回定义或预期的错误代码 使用显式参数定义和 Command开关 但是出于无关目
  • 使用 iOS Simulator 和 XCode 4 调试应用程序崩溃在 main() 函数中停止,而不是崩溃源 [重复]

    这个问题在这里已经有答案了 可能的重复 Xcode 4 2 出错时显示错误的代码行 https stackoverflow com questions 7973555 xcode 4 2 showing the wrong line of
  • 使用 yum 在 CentOS 上安装 OpenJDK 11

    我想使用 yum 安装 OpenJDK 11 然而 当我检查 OpenJDK 手册时 它说你只能使用 yum 安装 Java 8 但是 对于 Java 9 及以上版本 它说你必须下载 zip 或 tar 文件 https openjdk j
  • GPS 应用程序在 iOS 5 上停止工作 - 位置管理器未更新

    我开发了一个针对 iOS 4 3 的应用程序 效果很好 但自从我迁移到 iOS 5 0 以来 该应用程序开始表现出奇怪的行为 位置管理器不显示位置变化的更新 有人遇到过这种问题吗 谢谢你的帮助 我与 CLLocation 经理共享票价 出现
  • 没有 Visual Studio 2010 的 T4 代码生成?

    是否可以在不需要 Visual Studio 2010 的情况下运行 T4 代码生成 基本上我必须构建一个内部 ORM 不要问 如果我有选择我不会 我计划使用亚音速作为基础 但改变一些东西及其工作方式 然而我的主要问题是我可以从我编写的外部
  • Spring Data Elasticsearch (4.x) - 使用 @Id 强制 _source 中的 id 字段

    Summary 最近我们升级到 Spring Data Elasticsearch 4 x 这个主要版本的一部分意味着 Jackson 不再用于将我们的域对象转换为 json 使用MappingElasticsearchConverter相
  • 静态库中的 Objective-C 类别

    你能指导我如何正确地将静态库链接到 iPhone 项目吗 我使用添加到应用程序项目中的静态库项目作为直接依赖项 目标 gt 常规 gt 直接依赖项 并且所有工作正常 但类别 静态库中定义的类别在应用程序中不起作用 所以我的问题是如何将某些类