2010-07-21 53 views
4

我有一個協議:繼承的@property可以不滿足<protocol> @property嗎?

@protocol Gadget <NSObject> 

@property (readonly) UIView *view; 

- (void) attachViewToParent:(UIView *)parentView; 

@end 

和一個 「抽象」 基類,有一個實現(作爲一個getter,未顯示)的-(UIView *)view

// Base functionality 
@interface AbstractGadget : NSObject { 
    UIView *view; 
} 

@property (readonly) UIView *view; 

@end 

但是,當我執行Gadget協議的AbstractGadget一個子類,像這樣:

// Concrete 
@interface BlueGadget : AbstractGadget <Gadget> { 
} 

- (void) attachViewToParent:(UIView *)parentView; 

@end 


@implementation BlueGadget 

- (void) attachViewToParent:(UIView *)parentView { 
    //... 
} 

@end 

我得到一個編譯錯誤告訴我「警告:屬性'視圖'需要方法'-view'被定義爲。「我可以讓這個消失使用@dynamic,或添加一個存根方法:

- (UIView *) view { 
    return [super view]; 
} 

但我只是想知道,如果我做的東西是不支持的,這是我不應該這樣做,或者如果它只是編譯器中的限制/錯誤?

回答

5

通過聲明屬性爲@dynamic,您告訴編譯器屬性getter(和setter,如果需要)在別處(可能在運行時)實現。這聽起來像是一個完全合理的用例。

請參閱The Docs瞭解更多信息。

+0

+1與我的回答相同,但要好得多,並鏈接到文檔。 – JeremyP 2010-07-21 09:34:08

+0

我必須用Clang和Xcode 4來測試它,當我能夠接觸到它們時。 – Sophistifunk 2010-07-22 00:00:54

0

這裏是可變的,財產規則和合成在Objective-C:

如果你有一個屬性,你必須有一個@synthesize或聲明@dynamic寫getter和setter方法自己。

所以,因爲你有一個名爲視圖的屬性,你必須聲明@synthesize。應該是這樣的。與@protocol無關,繼承

+0

對不起,我應該更具體。在AbstractGadget中有一個完整的「 - (UIView *)視圖」實現。 – Sophistifunk 2010-07-21 02:14:23

+0

您是否也可以在AbstractGadget實現中向我顯示您的代碼。現在出現了一些錯誤,因爲它通常適用於我 – vodkhang 2010-07-21 03:28:29

+2

由於該屬性是在基類中實現的,所以在子類中使用@dynamic。 – JeremyP 2010-07-21 09:29:04

2

我也遇到了這個確切的問題。這是@dynamic的一種情況。