4

によって作成されたNSDateオブジェクトがあります

NSDate *date = [[NSDate alloc] init];

後で、日付を「今」にリセットしたいので、

[date init];

また

date = [date init];

仕事をするかもしれませんが、そうではありません。その代わり、

[date release];
date = [[NSDate alloc] init];

動作します。のドキュメントには次のように書かれているので、私はこれについて少し混乱して- (id) initいます。

現在の日時に初期化されたNSDateオブジェクトを返します。

すでに割り当てられているので、メッセージdateだけが必要ではないでしょうか。init

4

2 に答える 2

9

コンストラクターの論理的に分離できない半分allocと考えてください。init「init」で始まるメソッドは、特定のオブジェクトに対して1回だけ呼び出すことができます。オブジェクトが初期化されると、オブジェクトを再度初期化するのはエラーになります。これは、NSDateだけでなく、すべてのObjective-Cオブジェクトに当てはまります。ただし、NSDateオブジェクトも不変です。一度作成すると変更できません。

後者のコードが機能する理由は、NSDateの新しいインスタンスを作成しているためです。これは、正しい方法です。[NSDate date]を使用して、同じことを実行することもできます。(まだ)所有していないオブジェクトが返されることに注意してください。そのため、保持する必要がある場合は保持し、後で解放する必要があります。

誰かからオブジェクトを受け取った場合、そのオブジェクトはすでに初期化されていることに注意してください。(そうでない場合は、それを提供したコードのプログラミングエラーであるか、ルールの非常にまれな例外です。)

于 2009-08-06T19:35:38.377 に答える
5

現在の日付を取得したい場合は、次を使用できます。

NSDate * now = [NSDate date];

あなたがそれを保持したいなら、それretainから。

NSDate * now = [[NSDate date] retain];

initでリセットすることはできませんNSDate。initはオブジェクトを初めて初期化するためだけのものです。

別の日付を取得できます。

NSDate * now = [[NSDate date] retain];
// use the now object
// need new date
[release now];
now = [[NSDate date] retain];
// once you don't need it release it
[now release];

dateメッセージはのインスタンスを返しますautoreleasedNSDateしたがって、releaseまたはautorelease

autorelease、オブジェクトを解放する必要がある場所を正確に気にしたくない場合に使用されます。オブジェクトはに配置されautorelease poolます。自動解放プール内のオブジェクトは、イベントループの反復が終了した後、またはプールでreleaseを呼び出したときに解放されます...(メモリ管理についてはAppleドキュメントを参照してください)。

ところで。これ[NSDate date]は便利な方法で、おそらく次のようなものです(完全に同じであるとは言えませんが、機能的には似ています)。

- (NSDate *)date
{
    return [[[NSDate alloc] init] autorelease];
}
于 2010-01-27T04:14:55.920 に答える