2012-02-26 18 views
0

以下のtempArrayを解放する際に問題が発生しています... tempArrayがリークで、返されました[tempArray autorelease]がクラッシュしました。誰もがtempArrayのメモリリークを取り除く方法を知っていますか?NSMutableArrayのメモリリークは、自動解放できません。

+(NSMutableArray*) returnTheArray:(NSString*)thePath forTheKey:(NSString*)theKey { 

NSString *errorDesc = nil; 
NSPropertyListFormat format; 
NSString *plistPath; 
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                  NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *testString = [thePath stringByAppendingString:@".plist"]; 
plistPath = [rootPath stringByAppendingPathComponent:testString]; 

if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) { 
    plistPath = [[NSBundle mainBundle] pathForResource:thePath ofType:@"plist"]; 

} 
NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization 
             propertyListFromData:plistXML 
             mutabilityOption:NSPropertyListMutableContainersAndLeaves 
             format:&format 
             errorDescription:&errorDesc]; 
if (!temp) { 
CCLOG(@"Error reading plist: %@, format: %d", errorDesc, format); 
} 

NSMutableArray *tempArray = [[NSMutableArray alloc] initWithArray:[temp objectForKey:theKey]]; 

return tempArray; 

}

答えて

2

さて、問題はreturnTheArrayはアナライザが保持値を返すように認識することを名前ではないということです - それは文句理由です。そのため、メソッドの名前を変更するか、自動解放された値を返します。しかし、後者の場合、戻り値の「コンシューマ」が適切に処理されていることを確認する必要があります。値が次の自動解放プール排水操作を超えて持続しなければならない場合は、保持します。

+0

おかげホットリックスが、私は「[tempArray自動リリース]を返す」に変更し、すべての「消費者」を保持することを確認しましたので、メソッドの名前を変更しても問題が解決する方法を見つけ出すことができませんでした戻り値の理想的なソリューションのようには見えませんが、メモリリークを解決しました – user1233894

+0

アナライザは、メソッドの名前に期待しています。 "new"、 "alloc"、または "copy"で始まるものは、保持された値を返すことが期待されます。他の名前は、保持されている値を返さないと仮定されています(返されるメソッドによって自動解放されるかもしれないし、そうでないかもしれないと考えられます - 何らかの理由で "安全"であることも知られています)。 –

0

試してみてください。

NSMutableArray *tempArray = [NSMutableArray arrayWithArray:[temp objectForKey:theKey]]; 
関連する問題