Warum wird nicht empfohlen ID zuzuweisen und zu initialisieren?

7

Welche möglichen Probleme können im folgenden Beispiel auftreten.

%Vor%     
Matthew Bischoff 16.07.2011, 17:29
quelle

4 Antworten

14

Das Hauptproblem mit dem Code in Ihrem Beispiel besteht darin, dass die Methode -init in einigen Fällen ein Objekt zurückgibt, das sich von dem Objekt unterscheidet, das Sie mit + alloc erstellt haben. Wenn das passiert wäre, wäre Ihr Code falsch, weil Sie das Ergebnis von [c init] nicht zu c zuordnen, und Sie würden am Ende mit dem falschen Objekt arbeiten (und einem, das nicht richtig initialisiert wurde). Deshalb lautet das Standard-Idiom immer + alloc und -init in derselben Zeile zu kombinieren:

id c = [[Personenzuweisung] init];

Nun haben Sie vielleicht die Person-Klasse geschrieben und wissen aus erster Hand, dass -in immer das gleiche Objekt zurückgibt, aber ich sollte nicht unbedingt vertraut sein mit der inneren Funktionsweise von Person, um Ihren Code zu lesen und einen Sinn zu haben ob es richtig ist oder nicht. Ihr Code ist "besser" in dem Sinne, dass jeder sagen kann, dass er das Richtige tut, wenn Sie die übliche Konvention befolgen.

Ich finde es nicht schrecklich, c als Typ-ID zu deklarieren, aber in diesem Fall scheint es albern. Sie wissen , dass c vom Typ Person * sein wird, warum also als ID deklarieren und nützliche Informationen wegwerfen, die der Compiler verwenden kann, um Ihnen zu helfen, besseren Code zu schreiben? Wenn es einen guten Grund gibt, ID zu verwenden, ist das in Ordnung, aber wenn Sie genauer über den Typ entscheiden können, sollten Sie dies tun.

    
Caleb 16.07.2011, 17:43
quelle
4

Wenn Sie den generischen Typ id verwenden, erhalten Sie keine Warnung, wenn Sie versuchen, eine Methode aufzurufen, die nicht existiert. Der Compiler geht davon aus, dass Sie wissen, was Sie tun.

Ansonsten keine Probleme, die ich mir vorstellen kann. Es ist in mehreren Situationen üblich (schnelle Aufzählung auf heterogenen Containertypen)

    
Nektarios 16.07.2011 17:40
quelle
2

Eine weitere potentielle Gefahr besteht darin, dass Sie im Laufe der Zeit eine Logik hinzufügen können, die für bestimmte Fälle nur init initialisiert ... ein Objekt zu belassen, das zugewiesen, aber nie initialisiert wird, bedeutet, dass alle Werte im Wesentlichen zufällig sind und jeder Setup-Code gemeint ist zu tun ist nicht getan.

    
quelle
-1

Geben Sie zunächst das Casting-Problem ein. Jedes Mal, wenn Sie " c " verwenden möchten, müssen Sie möglicherweise (Person *) eingeben, d. H. Typecast.

Zweitens, wenn Sie eine Methode in Person deklariert haben, können Sie sie nicht als [c aMthod] style aufrufen, Sie müssen [(Person *) c aMethod].

verwenden     
karim 16.07.2011 17:32
quelle

Tags und Links