gpt4 book ai didi

ios - 框架使用库崩溃

转载 作者:行者123 更新时间:2023-12-04 07:32:52 27 4
gpt4 key购买 nike

我有 2 个由我创建的框架,它们使用(它们都)一个由我创建的库。

第一个框架初始化库并使其所有工作流。完成第一个框架后,必须开始第二个框架。
但是当第二个要启动时,在初始化库后,使用这两个框架的应用程序崩溃并显示 exc_bad_access错误。

显然库创建正确,但如果我在第二个框架中注释用于初始化库的代码行,工作流程将继续(它稍后崩溃,因为它没有库初始化)。

有什么我做错了吗?我应该使用两个单独的库吗?

编辑:

想象一下这样的情况:

框架 A 有以下方法:start , stop .当它工作时,它委托(delegate)给方法:infoFromA , frameworkAFinished .

框架 B 有这个方法:start , stop .当它工作时,它委托(delegate)给方法:infoFromB , frameworkBFinished .

两个 start 方法都初始化提到的静态库(我们称之为 problematicLibrary )。

这两个框架都提供了一些 View 来实现其功能。因此,让我们举一个应用程序工作流程的示例。

在应用程序 View viewWillAppear方法,我只是使用以下方法启动框架 A:
[FrameworkA start]; ,这将初始化库并呈现一个 View 。有了这个 View (使用我的 problematicLibrary),一些信息将被委托(delegate)给 infoFromA委托(delegate)方法。并且在所有信息被委托(delegate)后,它将委托(delegate)给frameworkAFinished .

当 FrameworkA 已委托(delegate)给 frameworkAFinished 时我开始下一个框架:[FrameworkB start] .作为另一个框架,它将初始化库并呈现一个 View 。在调试时,库的所有初始化都已完成(创建所需对象的实例并创建库的新实例),并在呈现 View 时通过 viewDidLoad方法然后它抛出一个 exc_bad_access problematicLibrary 处的错误初始化行(之前已经完成并继续呈现 View !!)而无需从 View 中进入任何其他方法。

我检查了初始化是否正常,所有变量都在 null初始化之前的值,并给库对象一个新的内存地址。

最佳答案

这对我来说听起来很像符号冲突。我只是很惊讶链接器没有捕获它,但我认为这是因为您在两个框架中都使用了静态库,而不是简单的另一个框架。

一般来说,我会警告说“这是一个坏主意™”。你试图在你的设计中引入的基本上是依赖管理。喜欢很多博客文章,特别是this所以回答建议,你应该避免将框架(和扩展库)打包到框架中。

在您的场景中最有可能发生的是(我承认我在这里有点猜测):您将库链接到框架 A。因此,库成为它的固定部分。它的符号在其中,即使您没有在任何头文件等中将它们公开给应用程序。只要你只使用它,一切都会顺利进行。然后是框架B,库也是其中的一个固定部分。即使您无法从您的应用程序中看到它,但其中包含非常相同的符号。然而,这与框架 A 已经加载的符号发生冲突,因此崩溃(如上所述,这通常会被链接器捕获,但我猜你通过预先构建框架并将库打包在他们)。也许其他人可以更详细地解释这一点,但这很快就变得不重要了,您将如何寻求解决方案。从我的角度来看,它不会以这种方式工作。

所以这里有一个关于如何解决你的问题的建议:

如果您真的真的需要像这样拆分(您的应用程序中使用的两个框架使用相同的依赖项),我建议从框架中删除该库(即让它们依赖它,但不要将实际的 .a 文件打包在他们)并正确记录。然后将库添加到您的应用程序项目中,就像添加框架一样。

如果你想让这个花哨且易于安装到其他应用程序中,我建议设置一个私有(private) CocoaPods存储库并将您的框架转换为私有(private) pod。然后,您可以轻松地将库(或“新框架 C”)定义为框架 A 和框架 B 的依赖项。然后 pod install在您的应用程序中,cocoapods 计算出依赖关系并将框架 C 自动添加到您的项目中。这个场景正是 cocoapods(或任何相关的依赖管理器)的设计目的。它自动化并有助于项目设置,因此最终构建(应用程序)不必动态确定它可以使用和不可以使用的内容。最终结果是一样的。

试图复制“在代码中”很快就会变得困惑。试图找出使用它们的周围应用程序/项目的事物的框架(例如“我的依赖项某某已经链接了吗?如果没有,我可以加载我自己的库版本吗?”)可能会导致很多疼痛。

好的,为了回应您的评论,我将尝试更详细的非 cocoapods 设置操作方法。不过,作为序言,让我说这有点难以在我的脑海中完成,因为我没有现成的示例项目可以玩。由于这是一个“设置一次,然后忘记它很长时间”,我不得不承认我对这些事情的内存有点模糊,因此将其视为一种“粗略的方向”。您可能需要配置与我记忆起来的方式不同的东西。因此,特此邀请其他 SO 用户也在这里编辑和更正我的答案。 :)

  • 首先,我不得不说我不确定您是否需要为此将静态库转换为框架,我认为您不需要,所以我将从这里开始(我从未在其中使用过静态库)道路)。
    这意味着您可以保留构建库的项目。再想一想,您可能必须这样做才能链接到库而不使其成为使用它的框架的一部分。在以下几点中,我仍会将此代码称为“库”,但假设您也能够将其转换为动态框架。
  • 构建框架 A 和框架 B 的项目应该改变。我不知道你是如何设置这个的(作为一个具有各种目标的项目,你是否有一个“开发应用程序”作为它的一部分来测试框架本身等等),但重要的是在构建框架的目标,应该链接库(即在“链接二进制与库”构建阶段),但是 不是 复制(即它不能处于“复制捆绑资源”构建阶段)。设置用于运行的任何开发/测试目标可能会很棘手,这取决于到目前为止您是如何做到的。例如,您可能必须在build设置中手动编辑库搜索路径才能正确编译框架。
  • 最后,很明显,您需要更改最终应用程序的项目设置。最初属于框架 A 和 B 的库现在需要直接从其项目链接,显然,它也需要复制到包中。请注意,将来任何包含您的框架(A 或 B 或两者)的任何项目都必须这样做,否则它们将无法工作,因为这些框架希望库存在(但不再“随身携带”) )。

  • 尽管有这个长长的文字墙,我认为它不应该那么复杂,但您可能仍然想查看如何 cocoapods can support you有了这样的东西,也许将来会有帮助。链接的文章需要有关如何使用 pod 和编写 pod 的基本知识,但站点上的其他指南对此进行了很好的解释。我之所以这么说是因为最后,当在项目中使用 cocoapods 添加多个引入依赖项的库/框架时,它基本上按照我上面描述的方式设置您的项目。它使用了一些花哨的 shell 脚本来确保将所有内容复制到正确的文件夹等,但总的来说它是这样工作的:pod 的 podspec 告诉 cocoapods 要在您的应用程序中包含哪些额外的 pod 以使其工作(pod 期望的依赖关系)在那里,但不会自己“带进来”)。

    关于ios - 框架使用库崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45077733/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com