2012-04-02 6 views
0

Hat jemand eine effizientere Möglichkeit gefunden, zu überprüfen, ob eine Variable null ist, und sie dann instanziieren? Ich weiß, dass die klassische Art und Weise zu schreiben ist:Nullobjekte effizient prüfen und beheben

if (myObject == nil) { 
    //instantiate and do other stuff 
} 

Oder

if (!myobect) { 
    //do stuff 
} 

die zu Kessel-Platte-esque für meinen Geschmack scheint, vor allem, wenn ich es oft zu tun haben.

EDIT: Hatte eine Inspiration, würde so etwas funktionieren?

-(id)instantiateIfObjectIsNull:(id)object withClass:(Class*)class { 
    if (object == nil) { 
     object = [[Class alloc]init]; 
    } 
    return object; 
} 
+1

Gibt es einen effizienteren Weg zu überprüfen, ob etwas "Null" ist und wenn ja, es zu instanziieren, als zu prüfen, ob es "Null" ist und wenn ja, instanziieren Sie es? Nicht wirklich ... Dies ist der effizienteste Weg, es zu tun. Sie können Ihre if-Anweisung anders schreiben, aber im Wesentlichen werden Sie sich nicht viel ändern. Zu überprüfen, ob etwas "nil" ist, ist dasselbe wie es zu negieren ('(myObject == nil) == (! MyObject'), aber ansonsten bleibt nichts mehr zu tun. –

+0

Wirklich? Auch nur eine einfache Instanzmethode, die ich könnte dies delegieren? – CodaFi

+1

Nein. Es gibt keinen Grund zu, es würde sogar Overhead generieren. –

Antwort

0

gut es ist im Wesentlichen das Gleiche, aber

if (!myobject) { 
    ..... 
    } 
+0

Ich suchte nach einer einmaligen Art von Methode, die in eine Klasse wie '[self InstantitiefIsNull: object];' – CodaFi

0

Wenn Sie ObjC verwenden ++, können Sie es aus diesem Blickwinkel nähern könnte:

#import <Foundation/Foundation.h> 

template < typename T > 
void InitIfNil(T*& obj) { 
    if (nil == obj) 
     obj = [T new]; 
} 

template < typename T > 
void TryIt() { 
    T * obj(nil); 
    NSLog(@"before: %@", obj); 
    InitIfNil(obj); 
    NSLog(@"after: %s : %@", object_getClassName(obj), obj); 
    [obj release]; 
} 

int main(int argc, const char* argv[]) { 
    @autoreleasepool { 
     TryIt<NSArray>(); 
     TryIt<NSString>(); 
     TryIt<NSMutableSet>(); 
    } 
    return 0; 
} 

Dies auch mit getan werden könnte, ein Makro ... Ich glaube nicht, dass dies Lesbarkeit hilft.

Eine dritte Option wäre C11-Generika - wenn Ihr Compiler sie unterstützt.

+0

gesetzt werden könnte, und das Problem dabei ist, dass es wiederum keine Flexibilität bietet mit Initialisierung - Sie wollen nicht immer "neu". –

+0

@ItaiFerber alle Optionen, sofern keine Parameter erforderlich sind. C++: Template-Spezialisierung. C-Makro: init durch den Parameter 'InitIfNil (obj, [[NSArray alloc] init])'. C11 generisch: überlastbar. – justin

+1

Nicht Ihren Code zu klopfen, nur auf die inhärenten Probleme mit dieser Art von Ansatz. ;) –