0

アプリは問題なく NSMutableArray をアーカイブに保存しますが、NSMutableArray を新しい NSMutableArray @ viewDidLoad にロードしようとするとすぐにアプリがクラッシュします。コードの最後に「tempArray = [unarchiver decodeObjectForKey:kDataKey46];」というブレーク ポイントを配置しました。tempArray はアーカイブされた配列でロードされていますが、「for」ループを通過すると @「[poolListData addObject:testTemp];」「poolListData」は「tempArray」からのデータを保持しません。また、ブレークポイントを使用せずにアプリをロードしようとすると、アプリがクラッシュします...どう思いますか?

お時間をいただきありがとうございます!ジェフ

 NSString *filePath = [self dataFilePath];
 if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
 {
  NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
  NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

  field1.text = [unarchiver decodeObjectForKey:kDataKey1];
  // snip another bunch of fields
  field37.text = [unarchiver decodeObjectForKey:kDataKey37];

  soundOn = [unarchiver decodeBoolForKey:kDataKey38];
  soundVolumeSlider.value = [unarchiver decodeDoubleForKey:kDataKey39];
  soundVolumeValue = [unarchiver decodeDoubleForKey:kDataKey39];
  tempArray = [unarchiver decodeObjectForKey:kDataKey46];

  [unarchiver finishDecoding];

  for(int i = 0; i < [tempArray count]; i++)
  {
   NSData *testTemp = 0;
   //NSString *temp = [tempArray objectAtIndex:i];
   testTemp = [tempArray objectAtIndex:i];
   [poolListData addObject:testTemp];
  //[poolListData addObjectsFromArray:tempArray];
  }

  /*
   firstNameTextField.text = field1.text;
   lastNameTextField.text = field2.text;
   adressTextField.text = field3.text;
   emailTextField.text = field4.text;
   */

  [tempArray release];
  [unarchiver release];
  [data release];
 }
4

2 に答える 2

3

これは少なくとも部分的にメモリ管理エラーだと思います。この呼び出しは自動解放されたオブジェクトを返すため、関数の最後でdecodeObjectForKeyを解放するのはバグです。tempArrayこれがアプリがクラッシュする理由です。アーカイブされてpoolListDataいない配列の内容を保持していないことについては、単に初期化するのを忘れて、項目を nil 配列に追加しようとしているのではありませんか?

于 2009-10-06T05:27:38.683 に答える
0

unarchive を呼び出しても値が表示されない場合は、配列にアーカイブできないものが含まれています。UIImage は、配列に保存しようとするものの例になると思います。問題の鍵は、アーカイブ時にその tempArray にどのような型があるかです。

于 2009-10-06T05:20:30.790 に答える