objective-c null

objective c - ObjectiveC: if(obj){...} Y si(obj!=Nil){...}, ¿cuál es mejor?



objective-c null (2)

He visto un montón de código ObjC que hacen:

obj = [[SomeObject alloc] init]; if (obj) { /// ... }

pero tal como lo entendí, el valor dentro () es un booleano, y 0 indica FALSO 1 indica VERDADERO (hay otro caso en otro idioma que 0 es verdadero y 1 es falso), y si un puntero no apunta a nada, se establece en NULL (nil), que # define como 0, por lo que me pregunto si es mejor si lo hago:

if (obj != nil) { /// ... }

como ESTÁ comprobando si el obj es nulo o no, no importa qué valor sea nil , por lo que no confía en que nil (o NULL ) pase a definirse como 0?


0 indica FALSO 1 indica VERDADERO

Cerca. En C (y Objective-C), un 0 se evalúa como falso, y un valor distinto de cero se evalúa como verdadero. Entonces, un puntero nulo (o NULO) es "falso", pero cualquier puntero que no sea nulo es "verdadero".

Sus ejemplos son esencialmente equivalentes; ninguno es "mejor" que el otro (a menos que usted o su base de código tengan una preferencia de estilo).


editar: después de probar un poco, he determinado que los compiladores modernos realmente crearán el mismo código de máquina para ambos casos ;

publicación original:

Es (de manera insignificante, tal vez) más eficiente de usar

if(obj) {

ya que no necesita crear el valor booleano intermedio (evaluando la expresión de comparación). No estoy seguro de a qué "otro idioma" se refiere con respecto a que el no cero sea FALSO; Lo más parecido que puedo pensar es que los programas c devuelven 0 para "éxito" y cualquier otra cosa para "error". Cada lenguaje moderno con el que he trabajado usa 0 como FALSO y cualquier valor distinto de cero para VERDADERO.

En Objective-C, nil es literalmente 0 (tratado como un puntero). No es solo un puntero a cero, es cero como un puntero. Por lo tanto, es confiablemente equivalente a FALSE (o, en nuestra nomenclatura "NO").

editar después de probar un poco, he determinado que los compiladores modernos realmente crearán el mismo código de máquina para ambos casos ; probablemente porque nil es esencialmente typedef''d a 0, por lo que sabe que los dos estilos de comprobación dicen "si este puntero no es cero".