2009-08-18 10 views
88

¿Cuál es la diferencia entre isEqual: y isEqualToString:?NSString: isEqual vs. isEqualToString

¿Por qué clases agregando isEqualTo * métodos (isEqualToArray para NSArray, isEqualToData para NSData, ...) en lugar de sólo anulando isEqual:?

Respuesta

95

isEqual: compara una cadena a un objeto, y volverá NO si el objeto no es una cadena. isEqualToString: es más rápido si se sabe que ambos objetos son cadenas, como las documentation estados:

Consideraciones especiales

Cuando se sabe que ambos objetos son cadenas, este método es una manera más rápida para comprobar la igualdad de isEqual:.

isEqualTo<Class> se utiliza para proporcionar comprobaciones específicas para la igualdad. Por ejemplo; isEqualToArray: comprueba que las matrices contienen un número igual de objetos, y que los objetos en un índice dado devuelven YES para la prueba isEqual:.

+3

Si usted cree Aaron Hillegass entonces no hay diferencia de rendimiento , solo un poco de tipo safty: http://blog.bignerdranch.com/334-isequal-vs-isequaltostring/ – Caro

+2

Gracias por el enlace - útil. Aunque nos está pidiendo que creamos a Mark Dalrymple, ¿a quién le digo? – Abizern

5

Mi suposición es que proporciona una ligera mejora en el rendimiento, como isEqualToString:. No tendrá que escribir a comprobar lo que pasó en

+0

Su conjetura es probablemente cierto :) – Philip007

14

Además, para escribir sus propios -isEqual: y -isEqualTo<Class>: métodos, la convención es permitir argumentos nulos para -isEqual: y elevar una excepción para los argumentos nulos a -isEqualTo<Class>:

+1

No había encontrado esto antes, ¿alguna documentación que usted sepa? –

+1

Esto no parece ser cierto para isEqualToString, que simplemente devuelve NO si pasa nil. –

+8

Interesante, está documentado en la sección Comparación de objetos del Cocoa Fundamentals Guide

4

Ampliando @Abizern y @ Jonathan Dann respuestas, tanto isEqual y isEqualToString funcionan con nil valores.

- (void)testStringEqual { 
    NSString *string = nil; 

    STAssertFalse([string isEqual:@"test"], @"NSString isEqual"); 
    STAssertFalse([string isEqualToString:@"test"], @"NSString isEqualToString"); 

    // Note that these both return NO 
    STAssertFalse([string isEqual:nil], @"NSString isEqual"); 
    STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString"); 

    string = @"test"; 

    STAssertTrue([string isEqual:@"test"], @"NSString isEqual"); 
    STAssertTrue([string isEqualToString:@"test"], @"NSString isEqualToString"); 

    STAssertFalse([string isEqual:nil], @"NSString isEqual"); 
    STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString"); 
} 
3

Recomiendo encarecidamente this. Los beneficios de rendimiento de isEqualToString son prácticamente insignificantes para la mayoría de las aplicaciones. Pero hay otras dos distinciones el autor menciona:

  • seguridad Tipo
  • La forma nil se maneja
+0

No veo ninguna diferencia en la forma en que nil es manejado por los dos. Be nil sea el receptor o argumento o ambos. – SayeedHussain

Cuestiones relacionadas