2010-05-27 83 views
1

我想設置一個自定義的委託協議,並得到一個奇怪的錯誤,我不明白。我不知道是否有人可以指出我在這裏做錯了什麼(我還是新的Ob-C和協議使用)...在協議中的自定義類定義的錯誤

情況是,我已經建立了自己的URLLoader類來管理加載並從互聯網上解析數據。我現在正在嘗試爲委託人設置一個協議,以便對URLLoader的事件作出響應。所以,下面是我的協議...

#import <UIKit/UIKit.h> 
    #import "URLLoader.h" 

    /** 
    * Protocol for delegates that will respond to a load. 
    */ 
    @protocol URLLoadResponder <NSObject> 
    - (void)loadDidComplete:(URLLoader *)loader; 
    - (void)loadDidFail:(URLLoader *)loader withError:(NSString *)error; 
    @end 

不過,我發現了以下錯誤兩種方法簽名:

Expected ')' before 'URLLoader' 

我覺得我必須忽視的東西小的和愚蠢的。任何幫助人可以提供將不勝感激!

哎呀......有人指出我應該包含URLLoader.h。那就是:

#import <Foundation/Foundation.h> 
#import "URLLoadResponder.h" 


/** 
* URLLoader inferface. 
*/ 
@interface URLLoader : NSObject { 
    NSString *name; 
    NSString *loadedData; 
    NSMutableData *responseData; 
    NSObject *delegate; 
    BOOL _isLoaded; 
} 

@property (nonatomic, retain) NSString *name; 
@property (nonatomic, retain) NSString *loadedData; 
@property (nonatomic, retain) NSObject *delegate; 

- (void)loadFromURL:(NSString *)url; 
- (void)addCompleteListener:(id)observer selector:(SEL)sel; 
- (void)removeCompleteListener:(id)observer; 
- (void)parseLoadedData:(NSString *)data; 
- (void)complete; 
- (void)close; 
- (BOOL)isLoaded; 
+ (NSURL *)makeUrlWithString:(NSString *)url; 
+ (URLLoader *)initWithName:(NSString *)name; 

@end 
+0

你是否有在URLLoader.h結束遺留下來的一些流浪的東西呢? – 2010-05-27 15:37:24

+0

我們可以看到URLLoader.h嗎? – deanWombourne 2010-05-27 15:46:01

+0

嗯......它似乎工作,如果我從URLLoader.h文件中刪除URLLoadResponder導入。但是 - 這不會讓我把URLLoader委託轉換爲NSObject 。對象屬性是否允許通過協議定義進行轉換? – bigmac 2010-05-27 16:03:44

回答

3

你在你的頭一個很好的循環引用,因爲每個標題包括其它(URLLoader包括URLLoadResponderURLLoadResponder包括`的URLLoader)。

您可以通過使用預先聲明打破它:

#import <UIKit/UIKit.h> 
//#import "URLLoader.h" <-- Remove it to break the circular reference 

@class URLLoader; // <-- Forward declaration 

/** 
* Protocol for delegates that will respond to a load. 
*/ 
@protocol URLLoadResponder <NSObject> 
- (void)loadDidComplete:(URLLoader *)loader; 
- (void)loadDidFail:(URLLoader *)loader withError:(NSString *)error; 
@end 
+0

真棒,謝謝! – bigmac 2010-05-27 16:16:50