2010-12-06 10 views
1

In der Apple-Dokumentation heißt es, dass NSDate-Objekte unveränderlich sind, was bedeutet, dass sie, wenn sie einmal mit einem Wert initialisiert wurden, nicht geändert werden können/sollten.Objective-C - Unveränderbare Deklaration in if - Scope und Memory Management?

jedoch in dem folgenden Code ich eine NSDate benötigen ein von zwei möglichen Werten zu sein, so natürlich ich verwenden könnte:

for (class* object in array) { 

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

     //Use fromDate 
     i++ 

    } 

Soweit ich weiß, das ist nicht gültig, da außen mit VonDatum Der if-Block liegt außerhalb des Bereichs.

wäre die Lösung normalerweise:

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++ 

    } 

Doch nach dem Apple-Docs, wenn ein NSDate erhält ‚init‘ es mit dem heutigen Datum initialisiert ist und da es unveränderlich ist, kann ich es nicht neu zuweisen.

Was ist hier richtig? Ist es einfach, meinen gesamten Code zweimal in die if-Blöcke zu kopieren? Oder habe ich den Begriff unveränderlich missverstanden? Oder brauche ich vielleicht nach der Zuweisung im ersten Beispiel einen Retain?

dank

+0

Ihre Terminologie deutet darauf hin, dass Sie die Unveränderlichkeit falsch verstehen. 'fromDate' ist nichts anderes als ein Zeiger, der in seinem Umfang beliebig oft wiederverwendet werden kann. Die ihm zugewiesenen Objekte, wie hier das NSDate, können unveränderlich sein, was bedeutet, dass sie nach der Erstellung nicht geändert werden können. Ein unveränderliches Objekt kann nicht geändert werden, aber ein Zeiger auf ein unveränderliches Objekt kann einem anderen Objekt derselben Klasse neu zugewiesen werden. Dies ist eine äußerst wichtige Unterscheidung. – Endemic

Antwort

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

Ihre Frage zeigt auch ein grundsätzliches Missverständnis, wie Zeiger Arbeit. Ja, die Dokumentation sagt, dass NSDate Objekte unveränderlich sind. Aber fromDate ist kein NSDate. Es ist ein NSDate*. Mit anderen Worten, es ist einfach eine Weiterleitungsadresse, die auf das tatsächliche Objekt NSDate verweist. Der Zeiger selbst ist änderbar (es sei denn, es ist als const deklariert), und Sie können sich frei fühlen, den Wert Zeiger so viel wie Sie möchten zu ändern. Die Sache, auf die der Zeiger zeigt (die tatsächliche NSDate) ist jedoch korrekt unveränderlich.

+0

Wichtig ist, dass * fromDate * nicht * ein Objekt ist, sondern ein Zeiger, der auf das Objekt zeigt. Sie können das Objekt selbst * (NSDate) * nicht ändern, aber Sie können ändern, auf welches Objekt der Zeiger zeigt. Das heißt, es ist absolut gültig: 'NSDate * myDate = aDate; myDate = anotherDate; '' –

3
NSDate* fromDate = nil 

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

Sie müssen nichts zuweisen, wenn Sie die Variable deklarieren.

Verwandte Themen