2012-01-24 10 views
0

質問があります。次のコードでEXC_BAD_ACCESSの理由はどこですか?Objective-C不良例外ドロップボックス

-(void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata { 
    if(metadata.isDirectory) { 
     db_Path = metadata.path; 
     int i = 0; 
     NSString *fileName = [[NSString alloc] init]; 
     for(DBMetadata *file in metadata.contents) { 
      fileName = [NSString stringWithFormat:@"%@", file.filename]; 
      [db_MetaFileNames addObject:file.filename]; 
      i++; 
     } 
     [self createMetaListArray]; 
     [fileName release];     
    } 
} 

-(void)createMetaListArray { 
    fileNamesAtDirectory = db_MetaFileNames; 
    for (int i=0; i < [fileNamesAtDirectory count]; i++) { 
     NSString *filePathWithName = db_directory; 

     [filePathWithName stringByAppendingFormat: 
      [fileNamesAtDirectory objectAtIndex:i]]; 

     [filePathsAtDirectory addObject:filePathWithName]; 
     [filePathWithName release]; 
    } 
} 

誰でも私を助けることができますか?ここで

+1

どこが失敗しますか? – Mark

+0

私の答えを削除しました。私はdb_directoryの由来を知りません。マークをエコーするには、どこが失敗するのですか? – Almo

+0

EXC_BAD_ACCESSはmain.m;にあります) –

答えて

1

:最初の行に

NSString *fileName = [[NSString alloc] init]; 
for(DBMetadata *file in metadata.contents) { 
    fileName = [NSString stringWithFormat:@"%@", file.filename]; 

NSStringは、3行目の新しい値で上書きされたを取得します。元の値が漏れます。

これが意味:あなたは/ ALLOC fileNameは上記のinitが、ループ内で割り当て

} 
[self createMetaListArray]; 
[fileName release]; 

最後の行のリリースのリリースではありません。あなたはそれを割り当て/コピー/保持しないので、あなたはそれを解放する "担当"ではありません。

2番目の機能には、同様の誤解があります。

[filePathWithName stringByAppendingFormat:[fileNamesAtDirectory objectAtIndex:i]]; 

これはfilePathWithNameを修正しません。新しい文字列を返します。

私はココアのメモリ管理ルールを読んでおいてほしいと思います。それらを理解することはあなたの人生を楽にするでしょう。