Я учусь использовать новую функцию раскадровки в iOS 5 для базового представления списка -> подробное представление навигационного приложения. Чтобы устранить сложность, я просто копирую свои данные в массиве. Массив имеет пользовательский класс («VehicleModel») с несколькими свойствами и инициализатором.
Большинство свойств являются просто NSStrings, но одно из них - указатель на объект «VehicleEngineInfo», который имеет одно свойство («engineType») и инициализатор:
-(id)initWithType:(NSString*)type {
if(self = [super init]) {
[self setEngineType: type];
}
return self;
}
У меня есть более специфический класс VehicleEngineElectric, который расширяет VehicleEngineInfo и добавляет свойство ("cellCountMask") и имеет собственный инициализатор:
-(id)initWithCellCountMask:(Byte)mask {
if(self = [super initWithType:ENGINETYPE_ELECTRIC]) {
[self setCellCountMask:mask];
}
return self;
}
Когда я создаю новый экземпляр «VehicleModel» для массива данных, я вызываю инициализатор следующим образом:
VehicleModel *m1 = [[VehicleModel alloc] initWithName:@"name" Brand:@"brand" Model:@"model" Type:TYPE_CAR Status:STATUS_ACTIVE EngineInfo:[[VehicleEngineElectric alloc] initWithCellCountMask:0x01] Image:IMAGE_CAR];
Если я сразу попытаюсь прочитать обратно свойство engineType ([[m1 engineInfo] engineType]), оно работает нормально. Когда я пытаюсь прочитать то же свойство engineType в другом методе (например, prepareForSegue :), я получаю исключение NSInvalidArgumentException с прекрасным сообщением «нераспознанный селектор отправлен в экземпляр ...». Я могу читать любые другие свойства объекта VehicleInfo просто отлично - только свойство VehicleEngineInfo вызывает проблему.
Сначала я подумал, что это проблема управления памятью (сохранение / освобождение), но у меня включена поддержка ARC, поэтому этого не должно быть. Почему свойство engineType теряется, когда я покидаю метод, в котором оно было создано?
UPDATE:
Объявления @property выглядят так ...
В VehicleEngineInfo:
@property (nonatomic, assign) NSString* engineType;
On VehicleEngineElectric:
@property (nonatomic, assign) Byte cellCountMask;
На главной модели автомобиля:
@property (nonatomic, assign) VehicleEngineInfo* engineInfo;
@property (nonatomic, assign) NSString* name;
@property (nonatomic, assign) NSString* brand;
@property (nonatomic, assign) NSString* model;
@property (nonatomic, assign) NSString* type;
@property (nonatomic, assign) NSString* status;
@property (nonatomic, assign) VehicleEngineInfo* engineInfo;
@property (nonatomic, assign) UIImage* image;
У операторов @synthesize просто есть имена свойств, поэтому в них нет ничего особенного.
Сообщение об ошибке таково:
2011-11-14 23: 33: 42.951 TableTest [15640: fb03] - [__ NSArrayI engineType]: нераспознанный селектор, отправленный экземпляру 0x6a89d90
2011-11-14 23: 33: 42.953 TableTest [15640: fb03] * Завершение приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: '- [__ NSArrayI engineType]: нераспознанный селектор, отправленный экземпляру 0x6a89d90'
* Первый вызов стека вызовов:
(0x129b052 0x174cd0a 0x129cced 0x1201f00 0x1201ce2 0x35ff 0x705e1e 0x3716d9 0x371952 0xbf986d 0x126f966 0x126f407 0x11d27c0 0x11d1db4 0x11d1ccb 0x1f53879 0x1f5393e 0x2e1a9b 0x24b8 0x2415)
прекратить вызывать, выбрасывая исключение текущий язык: авто; на данный момент объективно-ц