Ошибка композиции класса? - PullRequest
0 голосов
/ 22 сентября 2009

Интересно, если кто-то может объяснить, где я здесь ошибаюсь, я создаю 2 объекта (автомобиль и двигатель), где объект автомобиля содержит указатель на объект двигателя. Я знаю, что упускаю очевидное или просто совершаю какую-то глупую ошибку, но не могу понять, как это сделать.

NB: код все работает, кроме строки, которая является комментарием 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 ------------------------------------------------------------- **

ОШИБКА .... .... 1006 *

пробег 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'

ура -gary-

1 Ответ

3 голосов
/ 22 сентября 2009

Из документов для метода копирования:

Это удобный метод для классы, которые принимают NSCopying протокол. Исключение возникает, если нет реализации для copyWithZone:.

Вы реализовали copyWithZone?

А зачем копировать движок, когда можно было просто сохранить?

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

Возвращает сохраненный объект, как и методы копирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...