【发布时间】:2014-11-27 14:02:46
【问题描述】:
在 Swift 中,单例初始化程序在运行 XCTest 单元测试时被两次调用。
Objective-C 没有问题,但 init() 方法只被调用一次,正如预期的那样。
以下是构建两个测试项目的方法:
目标-C
单例类
创建一个带有测试的空 Objective-C 项目。添加以下准系统单例:
#import "Singleton.h"
@implementation Singleton
+ (Singleton *)sharedInstance
{
static Singleton *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[Singleton alloc] init];
// Do any other initialisation stuff here
});
return sharedInstance;
}
- (instancetype)init
{
self = [super init];
if (self) {
NSLog(@"%@", self);
}
return self;
}
@end
AppDelegate
在应用程序委托中添加对单例的调用,如下所示:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[Singleton sharedInstance];
return YES;
}
XCTestCase
同时添加对生成的测试类的单例调用:
- (void)testExample {
[Singleton sharedInstance];
// This is an example of a functional test case.
XCTAssert(YES, @"Pass");
}
结果
如果您在单例的init 方法中添加断点并运行测试,则断点只会被命中一次,正如预期的那样。
斯威夫特
现在创建一个新的 Swift 项目并做同样的事情。
单例
创建一个单例,将测试目标添加到它的Target Memberships
class Singleton {
class var sharedInstance : Singleton {
struct Static {
static var onceToken : dispatch_once_t = 0
static var instance : Singleton? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = Singleton()
}
return Static.instance!
}
init() {
NSLog("\(self)")
}
}
AppDelegate
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
Singleton.sharedInstance
return true
}
XCTestCase
func testExample() {
// This is an example of a functional test case.
Singleton.sharedInstance
XCTAssert(true, "Pass")
}
结果
这一次,如果你在单例的init 方法中添加一个断点并运行测试,断点将被命中两次,首先来自应用委托,然后来自测试用例,即您将拥有两个单例实例。
我错过了什么吗?
【问题讨论】:
-
不关心这个问题,但你可能想看看这个问题:stackoverflow.com/questions/24024549/…
标签: ios objective-c swift singleton