2011-07-16 11 views

Respuesta

14

El problema principal con el código en su ejemplo es que en algunos casos, el método -init devuelve un objeto que es diferente del que creó con + alloc. Si eso sucediera, entonces su código sería incorrecto porque no está asignando el resultado de [c init] a c, y terminaría trabajando con el objeto equivocado (y uno que no está inicializado correctamente). Esta es la razón por la cual la expresión estándar es combinar siempre + alloc y -init en la misma línea:

id c = [[Person alloc] init];

Ahora, puede haber escrito la clase Person y tener conocimiento de primera mano de que siempre devuelve el mismo objeto, pero no debería tener que estar íntimamente familiarizado con el funcionamiento interno de Person para leer su código y tener un sentido de si es correcto o no. Su código es "mejor" en el sentido de que cualquiera puede decir que está haciendo lo correcto si sigue la convención habitual.

No creo que sea horrible declarar c como identificación de tipo, pero parece tonto en este caso. Usted sabe que c será del tipo Persona *, entonces ¿por qué declararlo como id y descartar información útil que el compilador puede usar para ayudarle a escribir un código mejor? Si hay una buena razón para usar la identificación, está bien, pero si puede ser más específico sobre el tipo, debería hacerlo.

+1

+1 para detectar el error potencial -init :) – Eiko

-1

En primer lugar, escriba el problema de la conversión. Cada vez que desee utilizar 'c', puede necesitar (Person *), es decir, encasillarlo.

en segundo lugar, si usted tiene cualquier método declarado en persona, no se puede llamar como [c aMthod] estilo, usted tiene que utilizar, [(Person *) c aMethod].

+1

No necesita el segundo conjunto de corchetes ('[(Person *) c method]') – indragie

+2

Creo que casi nunca tiene que encasillar nada del tipo id. – Eiko

4

Cuando se utiliza el tipo genérico id, no recibirá una advertencia si intenta llamar a un método que no existe. El compilador supone que sabes lo que estás haciendo.

De lo contrario, no hay problemas que se me ocurra. Es común en varias situaciones (piense enumeración rápida en el tipo de contenedor heterogéneo)

+0

+1 Sucinta, respuesta correcta. – Caleb

2

Otro peligro potencial es que con el tiempo, puede agregar lógica que accidentalmente solo inicia en ciertos casos ... dejando un objeto asignado pero nunca inicializado significa que todos los valores son esencialmente aleatorios y cualquier código de configuración fue destinado a hacer no está hecho.

Cuestiones relacionadas