iPhone (iOS 4.3) アプリで NSMutableSet オブジェクトのアーカイブを解除する際に問題があります。
タイプ NSMutableSet の ivar を含む UIImageView のサブビューがあります。ヘッダーで NSMutableSet を定義しました (実装で合成しました):
@interface MyView : UIImageView
{
NSMutableSet *group;
}
@property (nonatomic, retain) NSMutableSet *group;
セットには、タイプ MyView の 0 個以上のオブジェクトへの参照が含まれています。group は MyView の属性であるため、nil 以外のグループ メンバー (MyView オブジェクト) への参照は循環します。
このビューを次のようにエンコードします。
- (void) encodeWithCoder:(NSCoder *)aCoder
{
NSLog(@"Encoding group for %@ -- %@", self.imageFilename, self.group);
[aCoder encodeObject:self.group forKey:@"group"];
}
NSLog は、正常なグループ オブジェクトがアーカイブされていることを示しています。しかし、エンコードを解除すると、NSException が発生します。
- (id) initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithFrame:CGRectZero];
self.group = [aDecoder decodeObjectForKey:@"group"]; // <- NSException here.
return self;
}
このバグを初めて見たとき、かなり詳細なエラー メッセージが表示されました。「キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: ' * -[NSCFSet count]: method sent to an uninitialized mutable set object'」
ただし、問題を再現すると、はるかに情報が少ないメッセージが表示されます。「NSException」のインスタンスをスローした後に呼び出された終了
アーカイブは次のコマンドで作成されます。
[NSKeyedArchiver archiveRootObject:parentOfMyView toFile:myFilepath];
そして、これで開きました:
[NSKeyedUnarchiver unarchiveObjectWithFile:myFilepath];
これについて助けてくれてありがとう。
- リッチ