2014-06-10 101 views
1

我已經繼承了我正在轉向ARC的Objective-C代碼。我有一些是申報的協議和接口引用彼此.h文件 - 這裏是在.h文件的基本格局轉換爲ARC - 解析前向引用

@class BasicService; 
@class BasicServiceObserver; 

@protocol BasicServiceObserver 
-(void)UPnPEvent:(BasicService*)sender events:(NSDictionary*)events; 
@end 


@interface BasicService : NSObject <Events_Observer> { 
    <<var declarations here>> 
} 

-(NSUInteger)addObserver:(BasicServiceObserver*)obs; 
-(NSUInteger)removeObserver:(BasicServiceObserver*)obs; 
-(BOOL)isObserver:(BasicServiceObserver*)obs; 
@end 

,並在.m文件中,BasicServiceObserver裁判標記作爲前瞻性參考。 .m文件包含上述.h文件。

//Events_Observer 
-(void)someEvent:(NSDictionary*)events{ 
    BasicServiceObserver *obs = nil; 

    [mMutex lock]; 
    NSEnumerator *listeners = [mObservers objectEnumerator]; 
    while(obs = [listeners nextObject]){ 
     [obs someEvent:self events:events]; // <-- Receiver type 'BasicServiceObserver' for instance message is a forward declaration 
    } 
    [mMutex unlock]; 
} 

驅使我堅果。我試圖將協議分成自己的.h文件並導入它(並刪除@class聲明)。那裏沒有快樂。

有關如何解決此問題的任何想法?

謝謝!

+0

這是無效的:'BasicServiceObserver * obs = nil;'。它應該是; 'id obs = nil;'。 – rmaddy

+0

如果你正在聲明它,你不需要設置'@class BasicServiceObserver'。此外,'BasicServiceObserver'不是類,所以你不能使用'@ class' – Daniel

+0

另外,就像一個提示,如果你只是將文件移動到ARC以便能夠將項目設置爲ARC。您還可以選擇性地禁用特定文件的ARC。 – Daniel

回答

3

由於BasicServiceObserver是一個協議,而不是一個類,它不應該在這種情況下提前宣佈。聲明它爲@class會誤導編譯器,認爲當沒有這樣的接口時,會有一個@interface BasicServiceObserver

這裏是你應該怎麼得到這個的狀態下,它編譯:

@class BasicService; 

@protocol BasicServiceObserver 
-(void)UPnPEvent:(BasicService*)sender events:(NSDictionary*)events; 
@end 


@interface BasicService : NSObject <Events_Observer> { 
    <<var declarations here>> 
} 

-(NSUInteger)addObserver:(id<BasicServiceObserver>)obs; 
-(NSUInteger)removeObserver:(id<BasicServiceObserver>)obs; 
-(BOOL)isObserver:(id<BasicServiceObserver>)obs; 
@end 

同樣,在.m文件

//Events_Observer 
-(void)someEvent:(NSDictionary*)events{ 
    id<BasicServiceObserver> obs = nil; 

    [mMutex lock]; 
    NSEnumerator *listeners = [mObservers objectEnumerator]; 
    while(obs = [listeners nextObject]){ 
     [obs someEvent:self events:events]; // <-- Receiver type 'BasicServiceObserver' for instance message is a forward declaration 
    } 
    [mMutex unlock]; 
} 

注:由於您無論如何清理文件,請考慮將<<var declarations here>>部分中的變量移動到.m文件中的類擴展名中。這可以幫助您減少包含在.h文件中的頭文件數量,並避免通過頭文件傳播實現中不必要的依賴關係。

0

正如其他人指出的,類和協議並不是一回事。

有時您確實想要定義兩者,例如系統UITableView類和UITableViewDelegateProtocol協議。

如果你想同時擁有一個協議和一類,我建議增加字協議到協議的名稱:

@protocol BasicServiceObserverProtocol 
-(void)UPnPEvent:(BasicService*)sender events:(NSDictionary*)events; 
@end 

但是,它可能會更好不創建BasicServiceObserver類。相反,使所有對象指針符合該協議

BasicServiceObserverProtocol,作爲@dasblinkenlight在他的文章中說。