目标C圆形进口
我具有被这样目标C圆形进口
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
我试图删除应用程序,清理项目并再次运行..相同的错误。 当我在两个类中的一个中删除导入时,它工作正常。
你知道我做错了什么吗?
谢谢,
无法重现您的问题。
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文件导入类不应该引入进口周期。您没有使用new
或alloc init
。这是为什么?
正如Phillip Mills所说,它不是与循环导入有关我在methodA或methodB中做了错误的操作(我真的不知道是什么),但现在它工作正常。感谢您的时间。 –
您无法重现问题的原因可能是您实例化了一个在OP的例子中,每个实例都是一个未分配的,未被实例化的实例,也就是类的NIL实例,因此是NSZombie条件。你的解决方案是正确的,应该被标记为已接受。 – Armand
这可能是因为它是不可重入的'dispatch_once',问题在导入阶段没有那么多的循环依赖。 –
是的,你可能是对的。但我能做些什么来避免这种情况? –
基本上,改变设计,以便所有'sharedInstance'方法都是初始化静态对象。当对象需要与其他对象交互时,请将其明确。 (“How”很大程度上取决于这些对象的用途以及'methodA' /'methodB'的作用。 –