2

私はObjective-Cのメモリ管理にかなり慣れていないので、理解できたと思いますが、解決できない問題があります。

私はこのプロパティを持っています:

@property (nonatomic, retain) NSDate *dateDisplayed;

カスタムメソッドを使用してviewDidLoadで割り当てます。

self.dateDisplayed = [self dbDateFormatToNsDate:@"15/11/2011"];

私のdbDateFormatToNsDate方法は次のようになります。

- (NSDate *) dbDateFormatToNsDate:(NSString *) date {
    NSDateFormatter *d = [[NSDateFormatter alloc] init];
    [d setDateFormat:@"dd/MM/yyyy"];
    NSDate *toReturn = [d dateFromString:date];
    [d release];
    return toReturn;
}

したがって、自動解放されたオブジェクトを返します(NSDateが規則に従っている場合)。viewDidLoadしかし、私が読み込もうとしている別の関数から抜け出すときdateDisplayed

[dateDisplayed isEqualToDate:[self dbDateFormatToNsDate:@"15/11/2011"]]

NSZombie例外が発生します。助けてくれてありがとう!

4

2 に答える 2

1

self.propertyを使用して割り当てる場合、setter methosが呼び出されるためプロパティは保持されますが、使用せずに割り当てる場合は保持されself.ません。retainもちろん、.hファイルの適切な定義があると仮定します。


代わりにでき[d autorelease];ます。私はこれについて完全にtoReturn気が進まないかもしれませんが、NSDateは、リリースした後でもフォーマッターを維持する必要があり、アクセスが悪くなる可能性があります。

試す:

- (NSDate *) dbDateFormatToNsDate:(NSString *) date {
    NSDateFormatter *d = [[NSDateFormatter alloc] init];
    [d setDateFormat:@"dd/MM/yyyy"];
    NSDate *toReturn = [d dateFromString:date];
    [d autorelease];
    return toReturn;
}
于 2011-10-07T03:15:07.390 に答える
0

alloc、copy、mutableCopyで始まらないメソッドによって作成されたオブジェクトを返すため、慣例では、オブジェクトを自動解放する必要があるとされています。

自動リリースとは、将来リリースされることを意味します。メソッドの呼び出し元がそれを保持する必要がある場合、メソッドの呼び出し元はそれを保持します。

メモリ管理ガイドをお読みください。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

ルールは次のとおりです。

1と3がその方法に適用されます。2は、それを保持する必要がある可能性のある呼び出し側クラスに適用されます。

1- 作成するオブジェクトを所有している名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッド(たとえば、alloc、newObject、mutableCopy)を使用してオブジェクトを作成します。

2-retainを使用してオブジェクトの所有権を取得できます 。受信したオブジェクトは通常、受信したメソッド内で有効なままであることが保証され、そのメソッドはオブジェクトを呼び出し元に安全に返すこともできます。次の2つの状況でretainを使用します。(1)アクセサーメソッドまたはinitメソッドの実装で、プロパティ値として格納するオブジェクトの所有権を取得する。(2)他の操作の副作用としてオブジェクトが無効になるのを防ぐため(「使用しているオブジェクトの割り当て解除の原因を回避する」で説明されています)。

3-不要になった場合は、所有しているオブジェクトの所有権を放棄する必要があり ます。リリースメッセージまたは自動解放メッセージを送信して、オブジェクトの所有権を放棄します。したがって、Cocoaの用語では、オブジェクトの所有権を放棄することは、通常、オブジェクトを「解放する」と呼ばれます。

4-所有していないオブジェクトの所有権を放棄してはなりません。 これは、明示的に述べられている以前のポリシールールの当然の結果です。

于 2011-10-07T03:17:10.553 に答える