2013-01-18 90 views
0

設置超屬性把這個簡單的類層次結構:目標C - 不能在子類中

tree.h中

@interface Tree : NSObject 
@property (nonatomic, assign) id<TreeDelegate> delegate; 
@end 

Tree.m

@implementation Tree 
@synthesize delegate; 
@end 

Aspen.h

@interface Aspen : Tree 
- (void)grow:(id<TreeDelegate>)delegate; 
@end 

Aspen.m

@implementation Aspen 
- (void) grow:(id<TreeDelegate>)d { 
    self.delegate = d; 
} 
@end 

當我嘗試做self.delegate = d;,我發現了以下錯誤:

-[Aspen setDelegate:]: unrecognized selector sent to instance 0x586da00

我期待Tree父類的delegate屬性對於子類是可見的,但它似乎並不是因爲錯誤表明父類的合成設置器不可見。

我錯過了什麼?我是否必須在子類級別重新聲明該屬性?我試着在Aspen執行的頂部添加@dynamic,但那也不起作用。這樣一個簡單的概念,但我已經失去了一個小時尋找解決方案。此時出於想法。

- 編輯 -

上面的代碼只是一個非常精簡例子來證明我看到的問題。

+1

我認爲我們需要實際的代碼 - 修復Aspen的implmentation錯字後,這對我來說工作得很好。 – Tim

+0

@Tim Typo修正了,謝謝。所以 - 這應該按原樣工作? – Madbreaks

+0

我無法發佈實際的代碼,但我更新了我的問題中的示例以更加真實地反映實際的代碼。 – Madbreaks

回答

0

我終於能圖這一點。我的實際代碼利用了第三方靜態庫,該庫在我的示例中定義了類別TreeAspen。我已經構建了一個新版本的靜態庫,它揭示了我的示例中給出的Tree delegate,但是,在將它添加到我的項目後,我沒有正確重新鏈接庫,結果舊版本仍然在運行時被訪問。經驗教訓:要勤於步驟導入第三方庫,並且當簡單的基本編程概念(如我的示例文本中)不起作用時,請退後一步,確保您點擊了我的和交叉t。

1

我只是想你的代碼,通過該協議的補充,一個對象實現它,必要importmain功能,我的系統上它就像一個魅力:

#import <Foundation/Foundation.h> 

@protocol TreeDelegate <NSObject> 
@end 

@interface MyDelegate : NSObject <TreeDelegate> 
@end 

@implementation MyDelegate 
@end 

@interface Tree : NSObject 
@property (nonatomic, assign) id<TreeDelegate> delegate; 
@end 

@interface Aspen : Tree 
- (void)grow:(id<TreeDelegate>)delegate; 
@end 

@implementation Tree 
@synthesize delegate; 
@end 

@implementation Aspen 
- (void) grow:(id<TreeDelegate>)d { 
    self.delegate = d; 
} 
@end 

int main(int argc, char ** argv) { 
    MyDelegate * d = [[MyDelegate alloc] init]; 
    Aspen * a = [[Aspen alloc] init]; 

    [a grow:d]; 
    return 0; 
} 
+0

哇,好的。這至少證實了我以前相信的事實,即它*應該*以這種方式工作。我會再看看我的代碼,看看我能否發現與你在這裏有什麼不同。 – Madbreaks