2012-03-24 5 views
1

私はこれがかなり基本的なものだと知っています。返信したい値をどのように公開しますか?

月の名前を返す関数を持つクラスがあります。漏れを防ぐために戻したい値をどのように解放するのか分かりません。クラスで

この値が宣言されています。

static NSDateFormatter *formatter = nil; 
if (formatter == nil) { 
    formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"MMMM yyyy"]; 
} 

物事は、その後に起こる、と:

if([exampleDate isEqualToDate: 
    [[self creationDate] laterDate:exampleDate]]) 
{ //earlierDate returns the earlier date 
    return(@"Examples"); 
}else{ 
    return([formatter stringFromDate:[self creationDate]]); 
} 

私はクラッシュを取得するので、私はにautoreleaseを使用してみましたが、私は間違ってそれを使用しています私はそれを解放しようとするとき。また、戻り値を文字列に代入しようとしましたが、同じクラッシュ問題があります。申し訳ありませんが、それは非常に基本的ですが、私は値を返すと同時に、これを適切にリリースする方法を知っていて、それがどのように動作するのか理解していただければ幸いです。

+0

。クラッシュしたときにどのようにオートリリースを使用していますか? –

+0

ARCに切り替えられない具体的な理由はありますか?この質問は無関係です:) – dasblinkenlight

+0

例では、フォーマッタ= [[[NSDateFormatter alloc] init] autorelease]を承認します。 – glenstorey

答えて

0

返品部分には漏れがありません。 stringFromDate:copyではないので、mutableCopy,retain,allocまたはnewは既に自動リリースされたオブジェクトを返します。

NSDateFormatterは、クラスが割り当て解除されるとリークします。漏れたくない場合は、@propertyを作成してdeallocで解放する必要があります。
ローカルの静的オブジェクトは常にリークします。
私はシングルトンの外でそのようなオブジェクトを使用しません。クラスの1つを作成するたびに、NSDateFormatterがリークします。ほとんどの場合、@propertyを使用する方が良いです。

私はこのようなハックを見てきましたが、私の意見では、彼らはあなたが最初の場所で持つべきではない問題を解決:

それは自動解放がために作られているもの間違いだ
- (NSString *)someDateFromString:(NSString *)str { 
    static NSDateFormatter *formatter = nil; 
    if (formatter == nil) { 
     formatter = [[NSDateFormatter alloc] init]; 
    } 
    if (str == nil) { 
     [formatter release]; 
     formatter = nil; 
     return nil; 
    } 
    // do something 
    return date; 
} 

- (void)dealloc { 
    [self someDateFromString:nil]; // will release the static date formatter. 
    [super dealloc]; 
} 
+0

しかし、いつフォーマッタが消えたり解放されたりしますか?私の(間違いなく間違った)理解はあなたがあなたが解放する必要がある場合です。 – glenstorey

+0

をリリースしたい場合は、静的変数を作成しないでください。そのための@propertyを作成してdeallocで解放してください。 –

+0

わかりました。クラスにはdealloc関数がありません。なぜなら私はそれを必要としないからです。 @propertyとdealloc tmrwを追加して、どうやったらどうなるか教えてください。 – glenstorey

関連する問題