Я использую XPC в одном из своих приложений на 10.8. Он имеет стандартную настройку с протоколами, определенными для экспортируемого интерфейса и удаленного интерфейса. Проблема, с которой я сталкиваюсь, связана с одним из моих методов в экспортированном интерфейсе.
У меня есть класс модели, давайте просто назовем его Foo
. Этот класс соответствует NSSecureCoding
, реализует +supportsSecureCoding
и правильно кодирует/декодирует внутренние свойства, используя безопасные методы кодирования. При передаче этого объекта через метод в моем экспортированном интерфейсе, который включает только один экземпляр, он работает нормально.
Проблема возникает, когда я хочу передать коллекцию этих объектов или NSArray
из Foo
объектов. Вот пример того, как выглядит подпись на экспортированном интерфейсе:
- (void)grabSomethingWithCompletion:(void (^)(NSArray *foos))completion;
И я внес в белый список класс Foo
, как указано в документации:
NSSet *classes = [NSSet setWithObject:Foo.class];
[exportedInterface setClasses:classes forSelector:@selector(grabSomethingWithCompletion:) argumentIndex:0 ofReply:YES];
Теперь это должно сделать так, чтобы этот массив можно было безопасно копировать по всему процессу и декодировать на другой стороне. К сожалению, похоже, это не работает должным образом.
При вызове метода в экспортированном протоколе получаю исключение:
Предупреждение: исключение, возникшее при декодировании полученного ответа на сообщение «grabSomethingWithCompletion:», удаление входящего сообщения и вызов блока отказа.
Исключение: Исключение при декодировании аргумента 1 вызова: возвращаемое значение: {v} void target: {@?} 0x0 (блок) аргумент 1: {@} 0x0
Исключение: значение ключа «NS.objects» имело непредвиденный класс «Foo». Допустимые классы: '{(NSNumber, NSArray, NSDictionary, NSString, NSDate, NSData)}'.
Это почти похоже на то, что он даже не зарегистрировал белый список, который я выполнил ранее. Есть предположения?
NSPropertyListSerialization
. Также кажется, что вы не одиноки - person CodaFi   schedule 27.05.2013