2017-09-12 1 views
1

initialisiert habe ich eine Methode, die Zeiger auf Zeiger param akzeptiert:Objective C Zeiger auf Zeiger - wie vorbei Null unterscheiden vs nicht Variable auf Null

+(void)someMethod:(NSString*_Nullable*_Nullable)parsed; 

Nun, wenn ich diese Methode aufrufen und übergeben „nil "als Parameter, und dann mache ich das dereferenzieren innerhalb von Verfahren wie:

*parsed = soemthing; 

I crash BAD Zugang bekommen. Jetzt Frage ist, wie Zustand zu konstruieren passing „Null“ zu unterscheiden vs nicht vorbei initilized Variable wie:

NSString* s; // this is technically nil too, but dereference works and doesn't crash 
[someObj someMethod:&s]; 

den Absturz zu verhindern, in ersten Fall erwähnt.

Antwort

2

Die Lösung ist relativ einfach, Sie sollten niemals eine nicht initialisierte Variable übergeben. Betrachten Sie dies tun:

NSString *s = nil; 
[someObj someMethod:&s]; 

Beachten Sie die & s, wie Sie irgendeinemethode haben erklärt, ein NSString zu verlangen **. Indem man & s tut, wird das geparste immer definiert, da die Variable offensichtlich irgendwo im Gedächtnis gespeichert wird. Sein Wert, der bei * geparst gespeichert wurde, wurde auf Null initialisiert. Sie sollten dann in der Lage sein, Dinge wie zu tun:

+(void)someMethod:(NSString* _Nullable *_Nullable)parsed { 
    if(NULL != parsed) { 
     if(nil == *parsed) { 
      *parsed = @"Our variable *s will now be set!"; 
     } 
    } 
} 

Genießen Sie!

+1

Hallo danke für die Antwort. Jetzt sehe ich, dass die Lösung vielleicht einfacher ist, als ich dachte. If (geparst) Bedingung sollte genug sein, um das Problem zu überprüfen, wie geparst ist eine Adresse dieses Zeigers im Speicher und die Adresse ist nicht Null im Falle der Übergabe Zeiger (gerade) auf nicht initialisierte Variable. – luky

+1

Streng genommen sollte der erste Test für "NULL" und nicht für "Null" sein. Letzteres gilt nur für Objekttypen. Der zweite Zeiger ist selbst kein Objekt. –

+0

@JoshCaswell danke, ich habe den Code aktualisiert, um dies zu berücksichtigen. Obwohl ich noch eine Plattform sehen muss, bei der NULL und NULL nicht beide durch den numerischen Wert 0 dargestellt werden, ist es richtig, dass NULL für Objektzeiger und NULL für Speicherzeiger verwendet werden sollte. – ekscrypto