我有一个包含多个目标的 Xcode 项目。基本上每个目标都是我的应用程序针对不同客户的定制版本。我尝试根据每个目标的构建设置中的用户定义字段自定义启动屏幕文件,然后使用 info.plist 中的该变量来确定哪个启动屏幕。如果可能的话,我更愿意使用用户定义的构建设置来维护一个 info.plist 。
我想知道是否有任何风险依赖于将消息传递给nil对象这一事实在客观C中没有任何作用.
在我的代码中,我有很多对UIKit的弱引用和其他随时都可以被识别的对象.由于我来自C++和语言,其中引用NULL是如何使程序崩溃的最快方法,我总是倾向于谨慎并写下防御性代码:
if (view)
[view removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)
在将消息传递给它之前,是否有任何检查视图是否为零的意义?我知道在这种情况下(从superview中删除子视图是安全的),但是有什么情况可能会出现问题吗?
性能影响如何?传递给nil的消息实际上是免费的,真的什么也没做?如果我说让它在循环中做了几千次怎么办?
是enumerateUsingBlock:线程安全吗?我的意思是,我可以在另一个线程上使用enumerateUsingBlock枚举NSMutableArray吗?
如何使用enumerateObjectsWithOptions:usingBlock:当使用NSEnumerationConcurrent选项时?
UIViewController.viewDidLoad()在 iOS 上的单元测试方法时,每个人最喜欢的注入依赖项的方式是什么?
鉴于我的实现是:
class MyViewController: UIViewController {
var service: Service = Service()
override func viewDidLoad() {
super.viewDidLoad()
service.load()
}
}
Run Code Online (Sandbox Code Playgroud)
我的测试课是这样的:
class MyViewController Tests: XCTestCase {
var vc: MyViewController!
var serviceMock = ServiceMock()
override func setUp() {
super.setUp()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
vc = storyboard.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController
vc.service = serviceMock
}
}
func testThatServiceIsCalled() {
XCTAssertTrue(serviceMock.loadCalled)
}
Run Code Online (Sandbox Code Playgroud)
这里明显的问题是viewDidLoad()在我实例化 viewController 的那一刻被调用,并且测试失败,因为模拟没有正确注入。
有什么解决办法吗?