Frage

Probleme mit dem Gültigkeitsbereich für NSDate in einer iphone app zu haben.

Ich habe eine Schnittstelle wie folgt definiert:

@interface MyObject : NSoObject {
    NSMutableArray  *array;
    BOOL        checkThis;
    NSDate      *nextDue;

}

Jetzt bei der Umsetzung Ich habe diese:

-(id) init
{
    if( (self=[super init]) ) {
        checkThis = NO;
        array = [[NSMutableArray alloc] init];
        nextDue = [[NSDate date] retain];


                NSDate *testDate = [NSDate date];
    }
    return self;
}

Nun, wenn ich durch die init verfolgen, bevor ich die Variablen checkThis tatsächlich zuweisen zeigt als Boolean. Array zeigt als Zeiger 0x0, weil es nicht ben zugewiesen hat. Aber die nextDue zeigt als ‚out of scope‘. Ich verstehe nicht, warum dies außerhalb des Bereichs ist, aber die anderen Variablen sind es nicht.

Wenn ich durch den Code verfolgen, bis nach den Variablen zugewiesen sind, Array zeigt nun als richtig zugeordnet werden, sondern nextDue ist nach wie vor außerhalb des Gültigkeitsbereiches. Interessanterweise ist die Testdate Variablen zugewiesen ganz gut und der Debugger zeigt dies als gültiges Datum.

Weitere interessanter Punkt ist, wenn ich die Maus über die Testdate Variable bewegen, während ich das Debuggen, zeigt es als ‚NSDate *‘ Art, die ich erwarten würde, da dies seine Definition ist. Doch die nextDue, die ich auf die gleiche Weise definiert ist, zeigt als ‚_NSCFDate *‘.

Jede googeln ich zu diesem Thema hat gesagt, dass das das Problem behalten, aber seine aus tatsächlich Spielraum, bevor ich versuche, auch die Variable zuzuweisen.

Bei einer anderen Klasse, die gleiche Definition für NSDate ok arbeiten. Es zeigt, wie Null, bevor ein Wert zugewiesen wird. Arghhh

War es hilfreich?

Lösung

Ich stellte diese Frage auch im iPhone Dev-Forum. Die Antwort, die ich dort ankam scheint korrekt zu sein. Grundsätzlich ist es eine lustige Sache im Debugger. Eigentlich nicht so komisch angesichts der Menge an Zeit, die ich dafür ausgegeben. Als ich NSLog verwende das Ergebnis der Variablen zu betrachten, ist es tatsächlich richtig den Wert zeigen.

Die NSDate gegen _NSCFDate Frage ist, wie Stephen sagte, eine gebührenfreie Brücke.

Andere Tipps

Ich bin mir nicht sicher, warum GDB wird Ihnen das Datum sagen, den Gültigkeitsbereich ist, sondern versuchen, die behalten entfernen. [NSDate Datum] erfordert keine beibehalten.

Ich habe whacky Verhalten so gesehen, wenn ich Debuggen sind, und ich habe vergessen, dass ich immer noch meinen binären im Release-Modus bin kompilieren.

Sie sollten auch sicherstellen, dass Sie deaktiviert Faule Symbol Laden in Xcode haben.

Sie haben ein paar Fragen hier.

Zum einen w hy sind einige Hinweise auf 0x0 und andere vor init abgeschlossen ist? Nun, haben sie nicht formatiert! Ihre Werte können sich nicht darauf verlassen, bis Sie sie initialisiert haben. Die Tatsache, dass einige von ihnen sind nil (0x0) ist nicht etwas, das Sie sollten sich verlassen.

Zweitens warum nextDue nicht richtig zugeordnet? Das klingt wie eine Optimierung durch den Compiler. Stellen Sie sicher, dass Sie im Debug-Modus sind (das heißt, keine Optimierungen). Sehen Sie, was der Wert zu einem späteren Zeitpunkt ist nach dem init Verfahren abgeschlossen und zurückgegeben. Sie können auch gerne die Initialisierung ändern [[NSDate alloc] init] was die Notwendigkeit beseitigt, den Wert zu erhalten.

Drittens: NSDate gegen _NSCFDate . Grundsätzlich NSDate hat eine „gebührenfreie“ Brücke mit CFDate (die unteren Ebene, C-ähnliche API für dasselbe ist). Der Compiler ist die Wahl offenbar die Corefoundation Version zu zeigen, anstatt die in Ihrem Code definiert. Es ist keine große Sache; Ich würde nicht darum kümmern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top