2011-05-09 39 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: