班级构成错误?

时间:2009-09-22 12:20:35

标签: objective-c

我想知道是否有人可以解释我在哪里出错了,我正在创建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'

欢呼 - 加里 -

1 个答案:

答案 0 :(得分:3)

来自复制方法的文档:

  

这是一种方便的方法   采用NSCopying的类   协议。如果是,则会引发异常   没有实施   copyWithZone:

你实现了copyWithZone吗?

为什么要在保留时复制引擎?

- (id)copyWithZone:(NSZone *)zone {
    EngineClass *engineCopy = [[EngineClass allocWithZone: zone] init];
    // copy variables here, deep or shallow
    return engineCopy;
}

它返回一个保留的对象,因为复制方法应该。

相关问题