为什么initWithCoder:在对象解码期间返回错误的对象类?

时间:2015-07-22 18:27:02

标签: xcode nscoding nskeyedarchiver 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 个答案:

没有答案