Почему я получаю "не поддерживает архивирование" в моем подклассе NSWindow? - PullRequest
1 голос
/ 16 декабря 2009

У меня есть следующий класс:

@interface SpWindow : NSWindow <NSCoding> {
  BOOL _editMode;
  SpBgView *bgView;
} ...

... который я затем называю архивом. Мой метод кодирования выглядит следующим образом:

- (void) encodeWithCoder:(NSCoder *)aCoder {
  NSLog(@"encodeWithCoder CALLED FOR SpWindow");
  [super encodeWithCoder:aCoder];
  NSLog(@"SpWindow's encodeWithCoder got past the super call");  
  [aCoder encodeObject:bgView forKey:@"bgView"];
  [aCoder encodeBool:_editMode forKey:@"_editMode"];  
}

... однако бит [super encodeWithCoder:aCoder]; приводит к следующему в журнале консоли:

encodeWithCoder CALLED FOR SpWindow
<SpWindow: 0x20009f660> does not support archiving
*** -[NSKeyedArchiver finalize]: warning: NSKeyedArchiver finalized without having had -finishEncoding called on it.

... в соответствии с документацией NSWindow класс соответствует протоколу NSCoding, поэтому я понятия не имею, почему я вижу эту проблему.

Есть идеи?

--- EDIT: Ссылка на класс для NSWindow показывает:

Conforms to NSCoding (NSResponder)

... НЕ просто "Conforms to NSCoding" - поэтому я предполагаю, что это означает, что только биты NSResponder соответствуют NSCoding?

Ответы [ 3 ]

4 голосов
/ 17 декабря 2009

Прямо из документации NSWindow:

Примечание: Хотя класс NSWindow наследует протокол NSCoding от NSResponder, класс не поддерживает кодирование. Устаревшая поддержка архиваторов существует, но ее использование устарело и может не работать. Любая попытка заархивировать или разархивировать объект NSWindow, используя объект кодирования с ключом, вызывает исключение NSInvalidArgumentException.

1 голос
/ 16 декабря 2009

Реализует ли ваш класс весь протокол или просто encodeWithCoder? Методы, помеченные как «обязательные», не являются обязательными.

0 голосов
/ 17 декабря 2009

ОК, похоже, я стал жертвой моего вмешательства в MVC-модель - NSview и NSWindow не делают NSCoding.

...