2015-10-26 15 views
2

В соответствии с the docs назначенный инициализатор всегда следует вызывать, однако, когда я пытаюсь получить тип крови пользователя без разрешения, создается NSError, но назначенный ему инициализатор (- [NSError initWithDomain:code:userInfo:]) никогда не звонил.Почему не назначен назначенный инициализатор

код я использую:

HKHealthStore *healthStore = [[HKHealthStore alloc] init]; 
HKBloodTypeObject *bloodType = [healthStore bloodTypeWithError:&error]; 
NSLog(@"Blood type: %@, error: %@", bloodType, error); 

Obs: Я знаю, что назначенный инициализатор не вызывается, потому что я swizzled его. Другие методы, такие как - [NSFileManager contentsOfDirectoryAtPath:error:], ведут себя так, как ожидалось.

Почему это происходит? Я что-то упускаю? Должен ли я открывать радар?

+0

Что вы пытаетесь выполнить, используя методы инициализатора NSError? – Allan

+0

Автоматическое ведение журнала ошибок: [https://github.com/fpg1503/FPGSilentLogger](https://github.com/fpg1503/FPGSilentLogger) – fpg1503

ответ

2

Когда ошибка возвращается к вам с помощью фреймворка, такого как HealthKit, который выполняет большую часть своей работы вне процесса, вероятно, что ошибки, которые вам возвращены, были созданы в другом процессе и затем переданы через XPC. Это означает, что полученный вами NSError был фактически восстановлен NSXPCConnection с использованием NSSecureCoding. Если вы посмотрите на протокол NSCoding, вы заметите, что initWithCoder: также является псевдо-назначенным инициализатором. Любой класс, который реализует NSCoding или NSSecureCoding, имеет initWithCoder: как дополнительный назначенный инициализатор, который можно вызывать вместо других назначенных инициализаторов.

+0

Отлично, спасибо :) – fpg1503

+0

Есть ли какие-либо другие «псевдо-назначенные инициализаторы»? Разве это не разрушает точку назначения назначенного инициализатора? То, как я это вижу, 'initWithCoder:' - удобный интеллигент, созданный с единственной целью соответствия 'NSCoding', не должен ли он вызывать' - [NSError initWithDomain: code: userInfo:] 'вместо' - [NSObject init] «Тогда? – fpg1503