我想知道是否有人可以解释我在哪里出错了,我正在创建2个对象(汽车和引擎),其中汽车对象包含指向引擎对象的指针。我知道我错过了明显或只是犯了一些愚蠢的错误,但我不能完全指责它。
注意:代码全部有效,但注释ERROR的行除外。
// INTERFACE ------------------------------------------------------- **
@interface EngineClass : NSObject {
}
@end
@interface CarClass : NSObject {
EngineClass *engine;
}
- (void)setEngine:(EngineClass *)value;
@end
// IMPLEMENT ------------------------------------------------------- **
@implementation CarClass
- (void)setEngine:(EngineClass *)newEngine {
if (engine != newEngine) {
[engine release];
engine = [newEngine copy];
}
}
@end
@implementation EngineClass
@end
// MAIN ------------------------------------------------------------ **
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
CarClass *newCar_001;
EngineClass *newEngine_001;
newCar_001 = [[CarClass alloc] init];
newEngine_001 = [[EngineClass alloc] init];
[newCar_001 setEngine: newEngine_001]; // ERROR
// Clean up
[newCar_001 release];
[newEngine_001 release];
[pool drain];
return 0;
}
// END ------------------------------------------------------------- **
错误是......
运行 2009-09-22 13:41:05.483 cocoa_engine_TEST [8606:a0f] 2009-09-22 13:41:05.485 cocoa_engine_TEST [8606:a0f] 2009-09-22 13:41:05.485 cocoa_engine_TEST [8606:a0f] - [EngineClass copyWithZone:]:无法识别的选择器发送到实例0x10010c8d0 2009-09-22 13:41:05.486 cocoa_engine_TEST [8606:a0f] ***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [EngineClass copyWithZone:]:无法识别的选择器发送到实例0x10010c8d0'
欢呼 - 加里 -
答案 0 :(得分:3)
来自复制方法的文档:
这是一种方便的方法 采用NSCopying的类 协议。如果是,则会引发异常 没有实施 copyWithZone:
你实现了copyWithZone吗?
为什么要在保留时复制引擎?
- (id)copyWithZone:(NSZone *)zone {
EngineClass *engineCopy = [[EngineClass allocWithZone: zone] init];
// copy variables here, deep or shallow
return engineCopy;
}
它返回一个保留的对象,因为复制方法应该。