2016-09-19 70 views
0

我具有被這樣目標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'的作用。 –

回答

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。這是爲什麼?

+0

正如Phillip Mills所說,它不是與循環導入有關我在methodA或methodB中做了錯誤的操作(我真的不知道是什麼),但現在它工作正常。感謝您的時間。 –

+0

您無法重現問題的原因可能是您實例化了一個在OP的例子中,每個實例都是一個未分配的,未被實例化的實例,也就是類的NIL實例,因此是NSZombie條件。你的解決方案是正確的,應該被標記爲已接受。 – Armand