2011-01-17 11 views
1

メモリリークなどの問題を既存のiPhoneアプリケーションで解決しようとしています。私はObjective Cを少し熟読していますが、プログラミングの基礎とiphoneアプリを開発する際に必要なメモリ管理の一般的な理解があります。私の質問は以下の方法についてです。iPhoneエラー、 '参照カウントされたオブジェクトはリリース後に使用エラーです';メモリリークのクリーンアップ

-(NSDate *)formatDate:(id)value{ 
NSLog(@"eja: DetailViewController/ formatDate()"); 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"]; 
[dateFormatter release]; 


return [dateFormatter dateFromString:value]; 


} 

それは読んでエラーを返して、「それはを解除された後参照さ-数えオブジェクトが使用です」。返される/使用される前に、dateFormatterが解放されていることがわかります。問題はもちろん、リターンステートメントの後にリリースを置くと、dateFormatterのvar宣言に関連する「オブジェクトの潜在的なリーク」エラーが発生することになります。

私はまた、 "自動解放"

return [[dateFormatter dateFromString:value] autorelease]; 

を試みたが、私は、エラー '送らオブジェクト - autoreleaseの回数が多すぎる' を取得します。

これを正しく記述して変数を適切に管理する方法についてのアドバイスはありますか?あなたがNSDateFormatterをリリースする前に、あなたはNSDateを作成することができます

答えて

2

[dateFormatter autorelease]; 

[dateFormatter release]; 

を交換し、それが動作するはずです!

+0

はい、本当にそうです!非常に簡単です。どうもありがとうございます。 – djeddiej

2

-(NSDate *)formatDate:(id)value 
{ 
    NSLog(@"eja: DetailViewController/ formatDate()"); 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"]; 
    NSDate *date = [dateFormatter dateFromString:value]; 
    [dateFormatter release]; 

    return date; 
} 

この方法は、あなたが戻ってきているオブジェクトは、手動メモリ管理を必要としませんが、あなたに割り当てられたNSDateFormatterは、それが必要としてリリースされます。

+0

この解決策は、ありがとうございます!しかし、私がさらに尋ねることができれば、日付と呼ばれる変数には何が起こりますか?私もそれをクリアする必要はありませんか?もう一度おねがいします... – djeddiej

+0

また、私はあなたに両方にチェックマークを付けることを望みますが、私は下記のphix23のソリューションを使用しました。ありがとうございました – djeddiej

+0

日付変数は、このメソッドでの使用期間中、メモリに保持されます。 @ phix23のソリューションを使用することの欠点は、 'dateFormatter'が決して解放されないことです。 http://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/autorelease –

0

[dateFormatter release]と書くのではなく、自動解放して、プロセスのコード行を保存することもできます。

- (NSDate *)formatDate:(NSString *)value { 
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"]; 
    return [dateFormatter dateFromString:value]; 
} 
関連する問題