<NSCoding>
概要:親クラスからカスタム クラスを派生させるencodeWithCoder
と、アプリケーションの状態の保存中にメソッドが呼び出されます。親を に変更するSKNode
と、encodeWithCoder
メソッドは呼び出されなくなります。
詳細:
UIKit
ビュー コントローラーは、アプリケーションの状態の保存中にエンコードされます。タイプ の単一のオブジェクトをエンコードしますMyNode
。
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
[super encodeRestorableStateWithCoder:coder];
MyNode *myNode = [[MyNode alloc] init];
NSLog(@"view controller encoding");
[coder encodeObject:myNode forKey:@"myNode"];
}
MyNode
この質問のために構築された簡素化されたクラスです。完全を期すためにコードを含めますが、encode メソッドと decode メソッドは単にNSLog
andを呼び出しますsuper
。
@interface MyParent : NSObject <NSCoding>
@end
@interface MyNode : MyParent
@end
@implementation MyParent
- (id)initWithCoder:(NSCoder *)aDecoder
{
NSLog(@"MyParent decoding");
self = [super init];
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
NSLog(@"MyParent encoding");
}
@end
@implementation MyNode
- (id)initWithCoder:(NSCoder *)aDecoder
{
NSLog(@"MyNode decoding");
self = [super initWithCoder:aDecoder];
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
NSLog(@"MyNode encoding");
[super encodeWithCoder:aCoder];
}
@end
上記のようにの親が の場合、MyNode
アプリケーションMyParent
の保存中にログに記録された出力が表示されます。
2014-05-12 15:22:33.342 Flippy[35091:60b] saving application state
2014-05-12 15:22:33.342 Flippy[35091:60b] view controller encoding
2014-05-12 15:22:33.343 Flippy[35091:60b] MyNode encoding
2014-05-12 15:22:33.343 Flippy[35091:60b] MyParent encoding
しかし、の親を に変更するとMyNode
、SKNode
実装encodeWithCoder
は呼び出されません。
2014-05-12 15:22:57.847 Flippy[35115:60b] saving application state
2014-05-12 15:22:57.848 Flippy[35115:60b] view controller encoding
なぜだめですか?
私が試したこと:
- 独自の を使用してカスタム クラスをアーカイブし
NSKeyedArchiver
ます。これは期待どおりに機能します。 - カスタム クラスにプロトコルを実装
UIStateRestoring
し、復元識別子を使用してアプリケーションに登録します。これは私にはあまり意味がありませんでした。 - この質問
classForCoder
のように、いじります。しかし、それが当てはまるようには聞こえず、とにかくカスタムクラスで呼び出されていません。classForCoder
(このテスト ケースに影響を与えた現実世界の問題の詳細は関係ないようです。)