- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是针对高级开发人员的高级问题。
所以我写了一个比较大的“子系统”。本质上,它是一个称为CleverViewController的UIViewController,它是一个UIViewController。
现在,有许多支持类(大约十个)可以完成艰苦的工作:执行数学函数,图像处理,纯逻辑函数,构建图像或具有数千行代码的功能。
(为此,我只是启动了一个新的XCode项目/应用程序“ Scratchpad”,除了加载并启动CleverViewController外,它几乎没有其他作用。因此,当前它可以作为应用程序运行,它启动CleverViewController。我提到的十个左右的类是其中的一部分的“子系统”只是放在该项目/应用中。)
因此,现在,我们将在各种应用程序中使用新技术CleverViewController。 (或者也许朋友想使用它,等等。)
做到这一点的最佳方法是什么?我是否搞砸了所有内容,真的应该是一个(相当大)的类,而不是十几个类? (我可以理解,然后我将在需要的地方简单地添加新的(大)类,就像添加任何其他类一样。)
我是否必须像Apple框架那样制作“框架”? (如果是这样,他们到底是什么,怎么做,等等?!?)
实际上,您只需要勉强地包括所有十二个类,就是这样(很显然,可以将它们放在分组的子文件夹中)。
那所有的标题等等呢? (目前,我在便笺本项目的pch文件中只有一打包含。)
单独“维护”这个“子系统”不容易吗?
恐怕我对此一无所知:如果答案很明显,请打我一下,让我知道。
谢谢你的任何信息!
马修,如果您看到此信息...我正在寻找您的Framework链接,但没有看到它。
最佳答案
理想情况下,您将创建一个动态库(框架将被视为该库)。
但是Apple选择在iOS中禁止这样做,因此最好的方法是使用静态库。然后您使用此库创建一个xcodeproj并将其与源一起分发给您的朋友-这样他们就可以帮助开发了;)
使用静态库,每个可执行文件随后将代码(通过静态链接)复制到其应用程序。在osx中,分发objc类是一场噩梦(由于在加载类时使用平面名称空间-您会遇到运行时类冲突)。
客户端使用此库所需要做的就是将库的xcodeproj添加到其应用中,将其配置为构建依赖项,然后进行链接。一旦掌握了它,这很容易。
如果可能的话,最好用c或c ++编写它们,因为objc符号和依赖项可能不会从最终的可执行文件中删除-如果它们仅在库中使用一个类,则它们仍然必须附带所有类。
祝好运
编辑
1)什么是静态|动态库?
在我对一个复杂主题的描述中要非常简短:
它们是可重用的二进制文件。如何使用,链接,合并和加载它们取决于图像类型。本质上,您可以通过编译产生该库的源文件的集合来创建共享库。然后,您只需将您的应用程序链接到库。这在软件开发中很方便。如果未将应用程序链接到Foundation.framework,则需要NSString的源才能使用该类。因此,它能够组织,分离和重用程序,从而大大简化了软件开发。这也很有用,因为当(例如)苹果更新操作系统(进而更新框架)时,您的应用程序可能会得到改善。这些更新会更改程序的执行-通常会更好,因为修复了错误并增强了性能。
更多细节:
http://en.wikipedia.org/wiki/Static_library
http://en.wikipedia.org/wiki/Shared_library
2)您说“ ...使用此lib创建一个xcodeproj ...” ..如何创建“ lib”?
好的,此过程与iOS相似,但以下是在OS X上的操作方法(我在这里使用的是Xcode 3.2.x):
选择菜单项File> New Project
在项目模板选择器中,选择“框架和库”
对于框架,请选择“可可框架”。请注意,该框架根本不需要使用Cocoa,它可以是纯C或C ++-它只是一个模板,您可以在保存项目后更改模板的设置。
对于静态库,请选择“ BSD C库”,然后从下面的弹出窗口中选择“静态”
对于动态库,请选择“ BSD C库”,然后从下面的弹出窗口中选择“动态”
同样,除了默认情况下生成的实现文件和目标链接到的库的扩展名之外,许多模板实际上是相同的。
3)当您说“分发objc类是一场噩梦”时,您的意思是例如如果我真的给你两个文本文件“ Soften.m”和“ Soften.h” ..?
在那种情况下,我的意思是:在某些情况下,分发具有objc类或类别的共享库是一场噩梦。问题在于,objc符号(任何定义的objc方法或类)在加载期间可能发生冲突。例如,将库加载到程序中时,来自2个单独的共享库的2个不同的类将发生冲突。
静态库不是问题-因为链接器将中止。但这是动态加载的问题,因为假设您有一个名为QTCaptureConnection的类,并且您的应用程序未链接到QTKit.framework(它也定义了此objc类)。如果您的应用程序的插件或加载到QTKit的可执行文件链接中的任何库,那么您将遇到objc加载冲突。
这意味着将仅加载一个类,并且在向您发送[[QTCaptureConnection alloc] init]
消息时将返回一个类-两个依赖项之一将不会返回它们期望的类。这意味着加载到可执行文件中的每个二进制映像的每个类名称和方法都必须是唯一的。大多数时候,这是您无法控制的。最明显的情况是开发插件。如果您正在开发插件,这还意味着您必须重命名分发的每个插件重用的每个类,或分发共享类的共享库-在许多情况下,这不是一个选择。
4)“ ..将lib的xcodeproj添加到他们的应用程序中”-您如何做到这一点?
您可以将Finder中的xcodeproj拖到Xcode中的打开项目中,就像处理头文件一样(但您不复制文件或将其添加到目标中)。然后Xcode更新引用,添加项目的符号(例如,类名,函数),然后您就可以将所拖动项目的目标配置为依赖项,并可以链接到项目的库。
5)c / ++可以理解,但是在这里不可行(我不认为)
这取决于库的功能。最终,没有单独使用C不能近似的c ++或objc功能。如此...您通常可以使用C或C ++来实现所需的功能。由于某个应用可能需要几个不同的库中的一个小功能,而每个库可能只有几个MB,因此该问题一发不可收拾。因此所有这些库都可以向最终应用添加(例如)20 MB。如果可以删除这些符号,则客户端(使用库)将只为他/她所说的(二进制大小)付款。因此,可以从最终应用程序中删除19 MB的未使用内容(也可以避免其他问题)。
6)苹果公司的“框架”项目到底是什么(UIKit,CoreGraphics等),在这里适合什么?
典型共享库的最大限制之一是它们将仅包含一个二进制映像(仅是编译后的代码)。因此,人们想出了无数种方法来将他们想要/需要分发的其他内容合并到二进制文件中,这些二进制文件是库的依赖项。示例包括图形/图像或基于文本的文件。
框架很酷,因为它们充当动态库,但是它们也是目录结构。使用框架,您可以只复制库使用的图像,pdf,nib文件等。
如果您使用的是静态库,则客户端(重用该库)将必须手动将每个资源添加到其应用程序的复制文件构建阶段,确保它们存在,并在应用程序和库成熟时保持同步。使用框架,大部分依赖项都将被删除。看看/System/Library/Frameworks/AppKit.framework/中的所有内容-它包含二进制文件(包括大量objc类的实现),大量本地化图像,nib文件,本地化字符串文件,标头文件和其他重要数据。
关于iphone - 导入新类包或“系统”的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4677606/
当我这样做时... import numpy as np ...我可以使用它但是... import pprint as pp ...不能,因为我需要这样做... from pprint import
我第一次尝试将 OpenCV 用于 Python 3。要安装,我只需在终端中输入“pip3 install opencv-python”。当我这样做时,我在 Finder(我在 Mac 上)中看到,在
如果有一个库我将使用至少两种方法,那么以下之间在性能或内存使用方面是否有任何差异? from X import method1, method2 和 import X 最佳答案 有区别,因为在 imp
我正在从 lodash 导入一些函数,我的同事告诉我,单独导入每个函数比将它们作为一个组导入更好。 当前方法: import {fn1, fn2, fn3} from 'lodash'; 首选方法:
之间有什么关系: import WSDL 中的元素 -和- import元素和在 XML Schema ...尤其是 location 之间的关系前者和 schemaLocation 的属性后者的属性
我在从 'theano.configdefaults' 导入 'local_bitwidth' 时遇到问题。并显示以下消息: ImportError
我注意到 React 可以这样导入: import * as React from 'react'; ...或者像这样: import React from 'react'; 第一个导入 react
对于当前的项目,我必须使用矩阵中提供的信息并对其进行数学计算,以及使用 ITK/VTK 函数来显示医疗信息/渲染。基本上我必须以(我猜)50/50 的方式同时使用 matlab 例程和 VTK/ITK
当我看到 pysqlite 的示例时,SQLite 库有两个用例。 from sqlite3 import dbapi2 as sqlite3 和 import sqlite3 为什么有两种方式支持s
我使用 Anaconda Python 发行版:Python 2.7 x64 和 Windows 7 SP1 x64 Ultimate。 当我import matplotlib.pyplot时,我得到
目录 【容器】镜像导出/导入 导出 导入 带标签 不带标签,后期修改 【仓库】镜像导出/导入
我正在寻找一种导入模块的方法,以便我可以从子文件夹 project/v0 和根文件夹 project 运行脚本。/p> 我在 python 3.6 中的文件结构(这就是没有初始化文件的原因) proj
我通常被告知以下是不好的做法。 from module import * 主要原因(或者有人告诉我)是,您可能会导入一些您不想要的东西,并且它可能会隐藏另一个模块中具有类似名称的函数或类。 但是,Py
我为 urllib (python3) 编写了一个小包装器。在if中导入模块是否正确且安全? if self.response_encoding == 'gzip': import gzip
我正在 pimcore 中创建一个新站点。有没有办法导出/导入 pimcore 站点的完整数据,以便我可以导出 xml/csv 格式的 pimcore 数据进行必要的更改,然后将其导入回来? 最佳答案
在 Node JS 中测试以下模块布局,看起来本地导出的定义总是在名称冲突的情况下替换外部导出的定义(参见 B.js 中的 f1)。 A.js export const f1 = 'A' B.js e
我在使用 VBA 代码时遇到了一些问题,该代码应该将 excel 数据导入我的 Access 数据库。当我运行代码时,我收到一个运行时错误“运行时错误 438 对象不支持此属性或方法”。来自我在其他论
我有一个名为 elements 的包,其中包含按钮、trifader、海报等内容。在 Button 类中,我正在执行 from elements import * 这执行正常,当我尝试 print(p
在我长期使用 python 的经验中,我遇到了一个非常奇怪的问题。 提前我想说我想知道为什么会发生这种情况 ,而不是如何更改我的代码或如何修复它,因为我也可以做到。 我正在使用 python2.7.3
我正在更新我的包。但是,我正在为依赖项/导入而苦苦挣扎。我使用了两个冲突的包 - ggplot2和 psych及其功能 alpha当然还有 alpha ggplot2 的对象不同于 alpha psy
我是一名优秀的程序员,十分优秀!