2011-05-09 74 views
1

我有一個類,MyClass,它實現了NSCopying協議,我有一個類,MyClassChild,它繼承自MyClassMyClassChild不執行NSCopying協議。我正在閱讀的教科書說它必須,但是我可以成功構建!教科書是錯的嗎?必須使用子類實現父母符合的協議嗎?

@interface MyClass : NSObject <NSCopying> { 

} 

@end 

@implementation MyClass 

-(id)copyWithZone:(NSZone *)zone 
{ 
    return self; 
} 

@end 

@interface MyClassChild : MyClass { 

} 

@end 

@implementation MyClassChild 

@end 

回答

2

當您不提供MyClassChildcopyWithZone:方法的實現時,該類從其超類(MyClass)繼承方法實現。這意味着MyClassChild確實符合NSCopying協議。如果MyClassChild需要在其實例被複制時做一些特殊的事情,那麼您應該覆蓋copyWithZone:並做任何需要做的事情。希望有所幫助。

P.S.我希望你認識到,返回self不是實現copyWithZone:的好方法嗎?

+1

+1錯過了。這不是「不好」,它顯然是錯誤的(除了在GC環境中)。您至少需要返回'[self retain];',然後僅用於不可變對象。 – JeremyP 2011-05-09 16:24:23

+0

是的,只是爲了快速編譯它 – TheLearner 2011-05-10 08:30:48

0

你是絕對正確的,NSCopying需要對象實現copyWithZone。但是,MyClass實施copyWithZone。所以MyClassChild已經通過從MyClass派生出來實現它。

+0

-1 NSObject的未實現'-copyWithZone是足夠聰明的檢查。它實現了'+ copyWithZone:',但這是一個類方法。 – JeremyP 2011-05-09 16:09:32

+0

哎喲,你說得很對。我甚至都沒有正確回答這個問題。 – 2011-05-09 16:21:48

+0

我現在編輯了我的答案。 – 2011-05-10 07:33:28

1

MyClassChildMyClass繼承其執行NSCopying。 `這是最重要的方法:即使您已指定

@interface MyClassChild : MyClass <NSCopying> 

編譯器,如果任何超類實現-copyWithZone: