2011-07-28 12 views
0

私は新しいNSDateを得るための好ましい方法を知っています[NSDate date]です。次のコードは、これまで例外をスローする理由が、私はちょうど混乱しているNSDateのalloc initとメッセージを割り当て解除されたインスタンスに送信

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM/dd/yyyy"]; 
NSDate *dateFromStr = [[NSDate alloc] init]; 
// produce date object 

dateFromStr = [dateFormatter dateFromString:self.releaseDate]; 

[dateFormatter setDateFormat:@"MM.dd.yyyy"]; 
NSString *strDate = [dateFormatter stringFromDate:dateFromStr]; 

[dateFormatter release]; 
[dateFromStr release]; 

このコードは、別のviewcontroller..somethingによって「仮想」ビューとして使用されているのViewControllerにある「メッセージ割り当て解除インスタンスに送信されました」これに類似:http://cocoawithlove.com/2009/01/multiple-virtual-pages-in-uiscrollview.html

答えて

2

あなたの最初の問題は、あなたがNSDateオブジェクトを割り当てることによってdateFromStrを宣言あなたはdateFromStr:の最初の呼び出しの結果を割り当てるとき、あなたはそのオブジェクトをリークしていることです。あなたはthusly簡素化(および漏れをなくす)ことができます:

NSDate *dateFromStr = [dateFormatter dateFromString:self.releaseDate]; 

あなたがこれについて知っておくべきことあなたは、このオブジェクトを割り当てていないということですので、あなたはそれを解放する必要はありません。 allocのようなメソッドを呼び出さない限り(そして他にもいくつかあります;メモリ管理に関する他の投稿を検索してください)、オブジェクトを解放する責任はありません。

投稿したコードでは、最後の行は割り当てられていないオブジェクトを解放し、エラーが発生しています。

あなたがそうでなければ、あなたがオブジェクトを上書きし、古いもののアドレスを失うだけで

NSDate *dateFromStr = [dateFormatter dateFromString:self.releaseDate]; 

を使用する必要があります

0

代わりの

NSDate *dateFromStr = [[NSDate alloc] init]; 
// produce date object 
dateFromStr = [dateFormatter dateFromString:self.releaseDate]; 

。 その後、あなたの手で新しいものをリリースしようとしています。そして、それをリリースするためのガベージコレクタの試みがあります。あなたの最初に割り当てられたオブジェクトは漏れています。

0
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM/dd/yyyy"]; 
NSDate *dateFromStr = [[NSDate alloc] init]; 
// produce date object 

ここでは、dateFromStrを作成しています。「John」と呼ぶことにします。

dateFromStr = [dateFormatter dateFromString:self.releaseDate]; 

[NSDateFormatter dateFromString]は、すでにオートレリースされている新しいオブジェクト "Tom"を返します。あなたは "John"への参照を紛失してしまいました。

[dateFormatter setDateFormat:@"MM.dd.yyyy"]; 
NSString *strDate = [dateFormatter stringFromDate:dateFromStr]; 

[dateFormatter release]; 
[dateFromStr release]; 

ここでは、すでに[自動リリース済み]のオブジェクトに[リリース]メッセージを送信しています。最終的には、 "Tom"では[release]が2回呼び出され、 "John"では0回呼び出されます。あなたはこのようなあなたのコードを書き換えることができ

:ところで

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"MM/dd/yyyy"]; 

// produce date object 
NSDate *dateFromStr = [dateFormatter dateFromString:self.releaseDate]; 

[dateFormatter setDateFormat:@"MM.dd.yyyy"]; 
NSString *strDate = [dateFormatter stringFromDate:dateFromStr]; 
+0

あなたは混乱のかなりのビットを持っているように見えることから、私は、あなたがObjective-Cでのメモリ管理上のビットを読み取ろうとすべきだと思います。たとえば、Appleのドキュメントにある「メモリ管理プログラミングガイド」を試してみてください。 –

関連する問題