2016-03-28 12 views
1

Ich bin ziemlich neu in Objective-C, habe aber ziemlich viel Erfahrung in C#. Ich versuche einige Abhängigkeiten-Injection-Frameworks in Objective-C zu überprüfen. Beim Betrachten einiger Frameworks habe ich etwas ganz anderes in Bezug auf die Konstruktoren/Initialisierer in einer Objective-C-Klasse gefunden.Ambiguität mit Objective c Initialisierer

Wenn ich will, wie unten, um ein Objekt durch einen Konstruktor injizieren

-(id)initWithService:(id<ServiceProtocol>)service; 

natürlich dies ist der Default-Konstruktor nicht und die Steuerung wird hier nicht geben, bis diese von einem anderen Ort genannt wird.

Nur -(id)init ist der Standardkonstruktor und das Steuerelement wird hier eingefügt, wenn dieses Objekt injiziert wird.

Also frage ich mich, ob es eine gute Praxis ist, initWithService von -(id)init zu nennen?

Oder für jede Klasse haben nur zwei Initialisierer den Initialisierer mit Konstruktor nur während Mocking und ignorieren sie während der automatischen Initialisierung durch das Framework?

+0

ich wirklich nicht Ihr Szenario genau folgen, aber ich werde meine Meinung sagen, dass, wenn Sie mache etwas anderes, nur um ein spöttisches Werkzeug zu befriedigen, du machst es falsch. – Avi

+0

Um ehrlich zu sein, ich möchte kein Werkzeug als solches verwenden. Dies ist eine klare Frage von Ziel-C. Was würden Sie tun, wenn Sie nicht init initialisieren können, aber Sie können nur init. – golldy

+0

Klingt so, als ob Sie 'initWithService:' [Ihren Initialisierer] (http://stackoverflow.com/a/26186421/2976878) und vielleicht sogar [make 'init' nicht verfügbar machen] (https://craftbeercraftcode.com) machen möchten/2014/12/28/better-brew-with-ns_unavailable /) wenn du keinen Standardwert dafür hast. – Hamish

Antwort

-2


Wie hier geschrieben https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011210-CH1-SW1
Die bewährte Methode ist benannt initialiser in einer solchen Art und Weise zu verwenden

-(instanceType)initWithYourNeeds:(SomeClassName *)obj 
{ 
    if(self==[super init]) 
    { 
     //do some stuff here 
    } 
    retur self; 
} 
+0

Ich bin mir nicht sicher, ob du meine Frage richtig verstanden hast. Was würden Sie tun, wenn Sie nicht mit Objekten initiieren können? – golldy

+1

Sie legen eine Eigenschaft nach der Initialisierung fest. Dies ist üblich, wenn Sie Ansichten von xibs laden, da Sie nicht kontrollieren können, welcher Initialisierer vom xib-loading-Mechanismus aufgerufen wird. – Avi