2011-09-13 6 views
1

私は最初の大きなアプリに入っていて、ここではメモリ管理に少し問題があります。IOS開発、ifとelseとautoreleaseを使ったリターン関数

-(id) dateFormatter:(id)date{ 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 
    [dateFormatter setDateStyle:NSDateFormatterLongStyle]; 
    if([date isKindOfClass:[NSString class]]) 
     return [dateFormatter dateFromString:date]; 
    else 
     return [dateFormatter stringFromDate:date]; 
} 

ここでわかるように、この例のすべてのリターンは、最後に自動解放が必要です。しかし、私はautoreleaseを追加すると、私はEXC_BAD_ACCESSエラーが発生しているし、すべてのことがうまく動作していない。私は問題を分析し、関数内にあまりにも多くのautoreleaseがあるが、私はどのように私はそれなしでNSDateFormatterのメモリを解放することができないのか分からない。

誰でもこれを説明できますか?

答えて

3

どうやっについて:

-(id) dateFormatter:(id)date{ 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 
    [dateFormatter setDateStyle:NSDateFormatterLongStyle]; 

    id retVal; 
    if([date isKindOfClass:[NSString class]]) 
     retVal = [dateFormatter dateFromString:date]; 
    else 
     retVal = [dateFormatter stringFromDate:date]; 
    [dateFormatter release]; 
    return retVal; 

} 
+0

確かに私はそれをすることができますが、私が試したやり方ではありませんか?ありがとう、これは明白なやり方で、これを行う方法であれば、それは私がやることです:-) – Erez

+1

誤ったオブジェクトに 'autorelease'を追加しているかのように見えます。あなたの質問から、私はあなたが行っていることを集めています: '[[dateFormatter dateFromString:date] autorelease];'それを置いておくべきです: '[[NSDateFormatter alloc] init] autorelease];' –

2

にautoreleaseを使用していないのはなぜ?

-(id) dateFormatter:(id)date{ 
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 
    [dateFormatter setDateStyle:NSDateFormatterLongStyle]; 
    if([date isKindOfClass:[NSString class]]) 
     return [dateFormatter dateFromString:date]; 
    else 
     return [dateFormatter stringFromDate:date]; 
} 
2

あなたは代わりにこれを行うことができます:それは戻って来るとき、あなたが正しく返される変数を割り当てていないことも

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 

その可能性を。

2

うん、いくつかの問題。まず、dateFormatterを使用していますが、返さないことです。ですから、dateFormatterを初期化するときにautoreleaseを呼び出すか、NSDateFormatterにオートレリースされたオブジェクトを持たせる必要があります。例えば

NSDateFormatter *たDateFormatter = [[NSDateFormatter ALLOC] INIT]自動リリース]。

又は

NSDateFormatter *たDateFormatter = [NSDateFormatterたDateFormatter]。

2番目の方法はありませんが、これらのことが正常に機能する方法を知っておくとよいでしょう。とにかく、上記の最初のメソッドを実行するとコードが修正されます。

[dateFormatter stringFromDate:date]または[dateFormatter dateFromString:date]を呼び出すと、dateFormatterはそれぞれNSStringまたはNSDateを返します。どちらの場合も、それぞれのメソッドstringFromDate:dateまたはdateFromString:dateによって、自動解放されたNSStringまたはNSDateオブジェクトが作成されます。

すでにオブジェクトが自動リリースされているため、オブジェクトをそのまま返すことができます。