目标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 

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

你知道我做错了什么吗?

谢谢,

+0

这可能是因为它是不可重入的'dispatch_once',问题在导入阶段没有那么多的循环依赖。 –

+0

是的,你可能是对的。但我能做些什么来避免这种情况? –

+0

基本上,改变设计,以便所有'sharedInstance'方法都是初始化静态对象。当对象需要与其他对象交互时,请将其明确。 (“How”很大程度上取决于这些对象的用途以及'methodA' /'methodB'的作用。 –

无法重现您的问题。

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。这是为什么?

+0

正如Phillip Mills所说,它不是与循环导入有关我在methodA或methodB中做了错误的操作(我真的不知道是什么),但现在它工作正常。感谢您的时间。 –

+0

您无法重现问题的原因可能是您实例化了一个在OP的例子中,每个实例都是一个未分配的,未被实例化的实例,也就是类的NIL实例,因此是NSZombie条件。你的解决方案是正确的,应该被标记为已接受。 – Armand