2010-12-06 8 views
1

アップルのドキュメントでは、NSDateオブジェクトは不変であると言われています。これは、いったん値で初期化されると変更できない/変更されないことを意味します。Objective-C - スコープとメモリ管理の内部の不変宣言?

しかし、私は当然、私が使用する可能性のある2つの可能な値の一つであることがNSDateを必要とし、次のコードで:外fromDateからを使用しているため

for (class* object in array) { 

     if (i == 0) { 
      NSDate* fromDate = //...a date 
     } else { 
      NSDate* fromDate = //...a different date 
     } 

     //Use fromDate 
     i++ 

    } 

限り、私は承知しているとして、これは有効ではありませんifブロックはスコープの外にあります。

ソリューションは、通常、次のようになります。

for (class* object in array) { 

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

     if (i == 0) { 
      fromDate = //...a date 
     } else { 
      fromDate = //...a different date 
     } 

     //Use then release fromDate 
     i++ 

    } 

しかし、Appleのドキュメントによれば、NSDateを受信したとき「を初期化」が今日の日付で初期化されますと、それは不変なので、私はそれを再割り当てすることはできません。

ここで正しいことは何ですか?すべてのコードをifブロックに2回コピーするだけですか?あるいは、私は不変の言葉を誤解したことがありますか?あるいは、最初の例の割り当て後に私は保持する必要がありますか?

おかげ

+0

用語は、不変性を誤解する可能性があることを示しています。 'fromDate'はポインタであるだけで、スコープ内で好きなだけ頻繁に再利用できます。ここにあるNSDateのように、割り当てられたオブジェクトは不変である可能性があります。つまり、作成後に変更することはできません。不変オブジェクトは変更できませんが、不変オブジェクトへのポインタは同じクラスの別のオブジェクトに再割り当てできます。これは非常に重要な違いです。 – Endemic

答えて

3
NSDate * fromDate = nil; 
if (i == 0) { 
    fromDate = //...a date 
} else { 
    fromDate = //...a different date 
} 

は、あなたの質問はまた、ポインタがどのように動作するかの基本的な誤解を明らかにする。はい、文書によると、NSDateオブジェクトは不変です。しかしfromDateNSDateではありません。それはNSDate*です。つまり、実際のNSDateオブジェクトがどこに存在するかを指し示す転送先アドレスです。ポインタ自体は変更可能です(constと宣言されていない限り)ポインタの値を好きなだけ変更することができます。しかし、ポインタが指しているもの(実際のNSDate)は正しく不変です。

+0

実現する重要なことは、* fromDate *はオブジェクトではなく、オブジェクトを指すポインタです。オブジェクト自体*(NSDate)*は変更できませんが、ポインタが指しているオブジェクトを変更できます。つまり、これは完全に有効です: 'NSDate * myDate = aDate; myDate = anotherDate; '' –

3
NSDate* fromDate = nil 

    if (i == 0) { 
     fromDate = //create here 
    } else { 
     fromDate = //or here 
    } 

変数を宣言するときに何も割り当てる必要はありません。

関連する問題