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".