1

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];

これについて助けてくれてありがとう。

- リッチ

4

0 に答える 0