0

更新: いくつかのことを考え出し、コードを変更しました。

my を配列に追加するとNSDictionary、前回追加した以前の辞書が突然置き換えられます。なぜこれが起こっているのかわかりません。plist をデータ ストレージとして使用しています。

次のようなエラー メッセージが表示されます。

スレッド 1: プログラム受信シグナル: "EXC_BAD_ACCESS"。

初期化

-(id)init{
    self=[super init];
    if(self){
        dbArray = [[NSMutableArray alloc] init];
    }
    return self;
}

新しいアイテムの追加。

-(void)addNewItem:(NSString *)aString
{
    // Creates a mutable dictionary with a anonymous string under the NAME key.
    NSDictionary *newString = [[NSDictionary alloc] initWithObjectsAndKeys:aString,@"name", nil];

    // Adds the new string to empty dbArray.
    [dbArray addObject:(newString)];
    NSLog(@"[add]:Added anonymous string to dbArray, under name key.");

    // Writes the current dbArray (with the dict) to plist and releases retain counts.
    [self writeItem];
    [newString release];
}

私のデータを表示する方法。

-(void)viewData
{
    // View data from the created plist file in the Documents directory.

    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *finalPath = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:finalPath]) {
        self.dbArray = [NSMutableArray arrayWithContentsOfFile:finalPath];
    }
    else {
        self.dbArray = [NSMutableArray array];
    }
}
4

2 に答える 2

1

新しいアレイを作成していると思います。

self.dbArray = [[NSMutableArray alloc] init];

dbArrayは、viewDidLoadまたはのinit上に作成する必要がありますUIViewController(これをで使用していると想定していますUIViewController

DataObject内で、次のことを行います。

  -(id)init{
    self=[super init];
    if(self){
      self.dbArray = [[NSMutableArray alloc] init];
   }
   return self;
  }
于 2011-12-12T14:10:50.593 に答える
1

代わりにこれ

self.dbArray = [[NSMutableArray alloc] init];

これを使って

if( nil == self.dbArray ) {
  self.dbArray = [[NSMutableArray alloc] init];
}

更新:(提供されたコードに基づく)

  • データの表示と保存にDataObjectクラスのさまざまなインスタンスを使用しています。各インスタンスの初期化中にファイルからデータをロードしないため、コンテンツは上書きされます。これをすばやく修正するには、DataObjectクラスのinitメソッドを次のように実装する必要があります。
- (id)init{
    self = [super init];
    if(self){
      [self viewData];
    }
    return self;
}

ViewControllerクラスのviewDidLoadからの次のコードは、アプリケーションを頻繁にクラッシュさせます。

db = [[DataObject alloc] init];
[db viewData];
[db release];

array = [[NSMutableArray alloc] initWithArray:[db dbArray]];

に置き換えます

db = [[DataObject alloc] init];
[db viewData];

array = [[NSMutableArray alloc] initWithArray:[db dbArray]];

[db release]Dealloc実装でのみ呼び出す

  • もう1つの問題は、おそらく発生する可能性があります。メイン画面に戻ったときに更新されたデータが表示されないことです。これを修正するには、ViewController.mファイルに次のメソッド実装を追加します。
- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];

  [db viewData];
  self.array = [NSMutableArray arrayWithArray: db.dbArray];
  [self.tableView reloadData];
}

AddView.mでも、次のコードを置き換えます

// Dismiss view and reload tableview.
ViewController *vc = [[ViewController alloc] init];
[self dismissModalViewControllerAnimated:YES];
[vc release];

// Dismiss view and reload tableview.
[self dismissModalViewControllerAnimated:YES];

アドバイスと同じように、デリゲートの使用とオブジェクトインスタンスとオブジェクト間のコピーの受け渡しに関する詳細を参照してください。

于 2011-12-12T14:10:59.867 に答える