Почему initWithCoder: возвращает неправильный класс объекта во время декодирования объекта?

Я пытаюсь использовать NSKeyedArchiver / NSKeyedUnarchiver в тривиальном тестовом примере и наблюдаю, что при вызове initWithCoder: созданный объект сообщает, что у него неправильный класс.

TestCoder.h

#import <Foundation/Foundation.h>

@interface TestCoder : NSObject <NSCoding>

@end

TestCoder.m

#import "TestCoder.h"

@implementation TestCoder

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];

    NSLog(@"TestCoder is a kind of of TestCoder? %@", [self isKindOfClass:TestCoder.class] ? @"YES" : @"NO");

    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:@"Test"];
}

@end

NSLog выводит:

2015-07-22 14: 10: 45.394 TestCoder [10858: 632647] TestCoder является разновидностью TestCoder? ДА

Однако, когда я тестирую это, это не работает.

#import <UIKit/UIKit.h>
#import <XCTest/XCTest.h>
#import "TestCoder.h"

@interface TestCoderTests : XCTestCase

@end

@implementation TestCoderTests

- (void)testExample {
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:[TestCoder new]];

    TestCoder *object = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    XCTAssert([object isKindOfClass:TestCoder.class]);
}

@end

Мои отчеты об испытаниях:

error: -[TestCoderTests testExample] : (([object isKindOfClass:TestCoder.class]) is true) failed

Но когда я проверяю класс объекта с помощью отладчика, я получаю результаты, которые противоречат моему тестовому примеру:

(lldb) po [object isKindOfClass:TestCoder.class]
true

Что здесь происходит?

Я вижу, что я не злоупотребляю isKindOfClass, используя простой тестовый пример, который проходит.

- (void)testClassEquality {
    TestCoder *object = [TestCoder new];
    XCTAssert([object isKindOfClass:TestCoder.class]);
}

Есть ли какая-то хитрость для правильной работы NSCoder, которую я не могу найти в документации?

0 ответов

Другие вопросы по тегам