2012-11-15 7 views
6

Ist es akzeptabel/safe in Objective-C/Cocoa die init Methode zur Verpackung wie folgt: Die [self init]Mit `self = [self init]` andere wickeln `init message`

-(id)init { 
    if ((self=[super init])) { 
     self.bar = [[Bar alloc] init]; 
    } 
    return self; 
} 

-(id)initWithFoo:(Foo *)f { 
    if ((self=[self init])) { 
     self.foo = f; 
    } 
    return self; 
} 

Hinweis in initWithFoo.

vielleicht ist dies eine einfache Antwort ja ... scheint offensichtlich, aber nicht Standard?

+2

Es ist akzeptabel. Mein einziger Kommentar ist über die zweite Methode. Es ist immer besser, etwas wie folgt zu verwenden: - (id) initWithFoo: (Foo) newFoo {.... self.foo = newFoo ....} –

+0

Sorry, wurde schnell die Frage veranschaulichen ... wird die Semantik – Ross

+4

korrigieren Ich würde sagen, es ist ungewöhnlich: Ihr 'initWithFoo:' ist der Initiator, der am meisten leistet. Aber es tut dies indirekt, indem es einen anderen Initialisierer aufruft, der etwas anderes tut. Gemeinsame (und _good! _) Übung ist _one_ benannter Initialisierer. Die spezifischste, die alle anderen Initialisierer mit Standardargumenten aufrufen. Und das wäre Nummer zwei, da es zwei Ivars initialisiert: 'foo' und' bar'. – danyowdee

Antwort

8

Es ist sicherlich akzeptabel und sicher. Ich bin nicht sicher, ob es Standard ist, aber ich denke nicht, dass es eine schlechte Übung ist.

Hinweis: Dies ist nicht überladen. Überladen bezieht sich auf eine sehr spezifische Sache in C-ähnlichen Sprachen (insbesondere C++), wo Sie mehrere Funktionen mit demselben Namen haben, die nur durch ihre Anzahl und/oder Arten von Parametern unterschieden werden. Ein besserer Ausdruck dafür wäre wahrscheinlich so etwas wie Forwarding oder Wrapping.

+0

danke für die zusätzliche "Note", immer geschätzt. – Ross

+3

Es ist definitiv Standardpraxis. Es ist der ganze Sinn von _Designated Initializer_. Siehe http://developer.apple.com/library/ios/#documentation/general/conceptual/DevPedia-CocoaCore/MultipleInitializers.html – Sulthan

2

Ich weiß, ich bin zu spät zur Party, aber ich dachte, ich würde meine zwei Cent hinzufügen.

Wenn Sie sowohl eine init liefern (was Sie auf jeden Fall tun wird) und ein initWithBlah dann würden Sie am besten sein, so etwas wie dies zu tun ...

- (id)initWithValue:(int)value 
{ 
    self = [super init]; 
    if (self) { 
     self.value = value; 
    } 
    return self; 
} 

- (id)init 
{ 
    int defaultValue = 10; 

    return [self initWithValue:defaultValue]; 
} 
Verwandte Themen