些細なテストケースで 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 を適切に動作させるためのトリックはありますか?