Singleton类

时间:2016-09-19 12:18:20

标签: objective-c xcode singleton circular-dependency nszombie

我有两个单独的类,它们被定义为

SingletonClassA.h

@interface SingletonClassA : NSObject

+ (SingletonClassA*) sharedInstance;

@end

SingletonClassA.m

#import "SingletonClassA.h"
#import "SingletonClassB.h"    

@implementation SingletonClassA

+ (SingletonClassA*) sharedInstance{
    static SingletonClassA* instance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [SingletonClassA];
        [[SingletonClassB shareInstance] methodB];
    });

    return instance;
}

@end 

SingletonClassB.h

@interface SingletonClassB : NSObject

+ (SingletonClassB*) sharedInstance;

@end

SingletonClassB.m

#import "SingletonClassB.h"
#import "SingletonClassA.h"

@implementation SingletonClassB

+ (SingletonClassB*) sharedInstance{
    static SingletonClassB* instance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [SingletonClassB];
        [[SingletonClassA shareInstance] methodA];
    });

    return instance;
}

@end 

当我构建项目时,一切似乎都很好但是当我在模拟器或手机上运行时,应用程序没有启动并显示NSZombie错误。

Class _NSZombie_BSXPCMessage is implemented in both ?? and ??.
One of the two will be used. Which one is undefined

我试图删除该应用,清理项目并再次运行..同样的错误。 当我在两个类中删除导入时,它可以正常工作。

你知道我做错了什么吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

无法重现您的问题。

<强> SingletonClassA.h

@interface SingletonClassA : NSObject

+ (SingletonClassA *) sharedInstance;
-(void)methodA;

@end

<强> SingletonClassA.m

#import "SingletonClassA.h"
#import "SingletonClassB.h"

@implementation SingletonClassA

+ (SingletonClassA*) sharedInstance{
    static SingletonClassA* instance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [SingletonClassA new];
        [[SingletonClassB sharedInstance] methodB];
    });

    return instance;
}

@end

<强> SingletonClassB.h

@interface SingletonClassB : NSObject

+ (SingletonClassB *) sharedInstance;

-(void)methodB;

@end

<强> SingletonClassB.m

#import "SingletonClassB.h"
#import "SingletonClassA.h"

@implementation SingletonClassB

+ (SingletonClassB*) sharedInstance{
    static SingletonClassB* instance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [SingletonClassB new];
        [[SingletonClassA sharedInstance] methodA];
    });

    return instance;
}

@end

在.m文件中导入类不应引入导入周期。您没有使用newalloc init。那是为什么?