我正在使用一些第三方软件来帮助使用Xcode 4.3.2编写iPad应用程序.该软件是开源的,通常设置为使其代码与开发人员为应用程序编写的任何代码一起编译.因为我在很多地方使用该软件,所以我决定将其构建为iOS模拟器的静态库.
我能够构建库,并将一个应用程序转换为链接到该库,而不是编译原始源代码.但是,当我在模拟器上运行应用程序时,我收到一条错误,指出发送到实例的无法识别的选择器.
我已经验证该程序是否成功使用了部分静态库.但是,有一段代码试图在对象上调用方法,以及发生故障的方法.被调用的方法实际上并未在该对象的接口中定义.而是在另一个模块中提供,该模块定义该对象类的类别.正确包含该模块的头文件,编译器应该能够找到类别方法并将其应用于对象,但在运行时,会出现上述错误.
我使用'nm'命令来验证静态库中是否存在类别方法.以下是输出示例:
nm libStaticLibrary.a | grep categoryMethod
00000130 t -[SomeClass(Category) categoryMethod:]
0000354c s -[SomeClass(Category) categoryMethod:].eh
Run Code Online (Sandbox Code Playgroud)
人们对如何使这个库与所需的应用程序正常工作有什么想法?
我在Mac OS X 10.7.5上使用CMake 2.8.10.2.
我已经配置CMake用Xcode构建一个简单的应用程序,创建一个空窗口.然后我尝试配置CMake以构建程序的DMG安装,使用以下命令指定背景图像:
设置(CPACK_DMG_BACKGROUND_IMAGE/path/to/image)
和自定义.DS_Store使用以下方法设置窗口大小和图标位置:
设置(CPACK_DMG_DS_STORE/path/to/DS_Store文件)
Xcode将成功构建应用程序并创建磁盘映像.当我安装图像时,它会显示正确的大小和图标位置,但背景始终设置为白色而不是指定的背景图像.
需要什么才能让背景在磁盘映像中正确显示?
我正在开发Swift中的应用程序.我想为应用程序设计一个允许对象之间松散耦合的系统,而一个策略(我在其他语言中成功使用)就是创建一个我称之为实例工厂的东西.这很简单,这是我在Swift中提出的基本实现:
import Foundation
private var typeGenerators = Dictionary<String, InstanceFactory.GeneratorCallback>()
public class InstanceFactory: NSObject {
public typealias GeneratorCallback = () -> AnyObject!
public class func registerGeneratorFor(typeName: String, callback: GeneratorCallback) {
typeGenerators[typeName] = callback
}
public class func instanceOf(typeName: String) -> AnyObject! {
return typeGenerators[typeName]?()
}
}
Run Code Online (Sandbox Code Playgroud)
这个想法是,当一个对象实例需要访问另一个对象实例时,而不是直接创建那个将两个对象紧密耦合的实例,第一个对象将通过调用instanceOf方法推迟工厂提供所需的实例.工厂将知道如何提供各种实例类型,因为这些类型将向工厂注册并提供可生成实例的闭包.
诀窍是如何让类注册到工厂.我以前在Objective-C中创建了一个类似的工厂,我注册工作的方式是覆盖需要向工厂注册的每个类的+ load方法.这对Objective-C非常有用,我认为它也适用于Swift,因为我会限制工厂只提供从NSObject派生的对象.看起来我已经开始工作了,我花了大量精力设计课程以利用工厂.
但是,在升级到Xcode 6.3后,我发现Apple不允许在Swift中使用load类方法.没有这个,我不知道允许类自动向工厂注册的机制.
我想知道是否有其他方式让注册工作.
哪些替代方案可以允许类别在工厂注册,或者可以使用哪些其他技术来实现工厂提供的相同类型的松耦合?
输入这个(人为的例子)代码
import Foundation
protocol ValueProviderProtocol {
var amount: Int { get }
}
class ValueProvider: NSObject, ValueProviderProtocol {
@objc dynamic var amount = 0
}
let _provider = ValueProvider()
var provider: ValueProviderProtocol { return _provider }
let subject = provider as! NSObject
let observer = subject.observe(\ValueProviderProtocol.amount, options: [.old, .new]) { (provider, changes) in
}
Run Code Online (Sandbox Code Playgroud)
进入Xcode 9游乐场,调用subject.observe会导致此错误:
无法推断通用参数"值"
目前尚不清楚导致错误的原因.可以做些什么来解决这类问题?
我有一台配备Mac OS X 10.7.5的MacBook Pro.我正在使用Xcode 4.4进行iOS开发,最近我升级到了Xcode 4.5.
对于我的应用程序,我构建了一些它所依赖的第三方库,并且这些库需要放在某个位置,以便我的应用程序可以将它们拾取并使用它们.但是我无法找到最近的库构建,因为即使Xcode说库已成功构建,组织器中的派生数据也无法使用.
我该怎么做才能确定这些库的构建位置?
使用Xcode 6.3,我在Swift中创建了一个非常简单,人为的命令行工具.它包含三个模块.
主要模块:
import Foundation
let displayer = ValueDisplayer()
displayer.displayValue()
Run Code Online (Sandbox Code Playgroud)
ValueDisplayer模块:
import Foundation
class ValueDisplayer {
func displayValue() {
println("The value is \(ValueProvider.instance.value)")
}
}
Run Code Online (Sandbox Code Playgroud)
和ValueProvider模块:
import Foundation
public class ValueProvider {
class var instance: ValueProvider {
struct Static {
static let instance = ValueProvider()
}
return Static.instance
}
var value: Int {
return Int(arc4random())
}
}
Run Code Online (Sandbox Code Playgroud)
这全部编译并成功运行.但是,我决定将ValueProvider转换为框架.我创建了一个Cocoa Framework目标,并将ValueProvider模块移动到它而不是命令行目标中.我将ValueDisplayer模块修改为:
import Foundation
import ValueProvider
class ValueDisplayer {
func displayValue() {
println("The value is \(ValueProvider.instance.value)")
}
}
Run Code Online (Sandbox Code Playgroud)
并配置命令行工具以链接框架.现在,我在与println语句相关的ValueDisplayer模块中收到以下编译错误:
模块'ValueProvider'没有名为'instance'的成员
我很困惑为什么代码不再起作用了.我想知道ValueProvider类是否不再正确合格,只是不清楚应该怎么做.
通过链接框架来允许命令行工具进行编译需要什么?
我正在使用OCMock来帮助我使用Xcode为iPad应用程序进行测试驱动开发.我有这样的测试代码:
id mock = [OCMockObject mockForProtocol:@protocol(SomeProtocol)];
Vector direction = { 1.0f, 2.0f, 3.0f };
[[mock expect] setDirection:direction];
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,我收到警告和错误,如下所示:
警告:找到名为'setDirection:'的多个方法
错误:将''vector'发送到不兼容类型
'UISwipeGestureRecognizerDirection'的参数(又名'enum UISwipeGestureRecognizerDirection')
显然,编译器无法确定模拟应该是什么类型的对象.我不知道如何指定它应该处理来自SomeProtocol协议的setDirection方法而不是来自另一个类的setDirection方法.
如何成功构建这样的测试用例?