NSString: isEqual frente a isEqualToString


94

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

¿Por qué las clases agregan métodos isEqualTo * (isEqualToArray para NSArray, isEqualToData para NSData, ...) en lugar de simplemente anular isEqual:?

Respuestas:


103

isEqual:compara una cadena con un objeto y devolverá NOsi el objeto no es una cadena. isEqualToString:es más rápido si sabe que ambos objetos son cadenas, como dice la documentación :

Consideraciones Especiales

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

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


3
Si cree en Aaron Hillegass, entonces no hay diferencia de rendimiento, solo un poco de seguridad: blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro

2
Gracias por el enlace, útil. Aunque nos estás pidiendo que le creamos a Mark Dalrymple, a quien hago :)
Abizern


16

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


1
No me había encontrado con esto antes, ¿alguna documentación que conozca?
Mike Abdullah

2
Esto no parece ser cierto para isEqualToString, que simplemente devuelve NO si pasa nil.
Jaka Jančar

9
Interesante, está documentado en la sección de comparación de objetos de la <a href=" developer.apple.com/documentation/Cocoa/Conceptual/… Guía de fundamentos</a>
Jonathan Dann

Esto no es verdad. isEqualToString no genera una excepción.
respectTheCode

1
La página web de Cocoa Fundamentals Guide dice: "Este documento puede no representar las mejores prácticas para el desarrollo actual". Es viejo, aparentemente.
cbh2000

5

Mi conjetura es que proporciona una ligera mejora en el rendimiento, como isEqualToString: no tendrá que escribir-cheque lo que pasó en.


Tu conjetura es probablemente cierta :)
Philip007

5

Ampliando las respuestas de @Abizern y @Jonathan Dann, ambos isEqualy isEqualToStringtrabajar con nilvalores.

- (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");
}

4

Recomiendo altamente este . Los beneficios de rendimiento de isEqualToString son básicamente insignificantes para la mayoría de las aplicaciones. Pero hay otras dos distinciones que menciona el autor:

  • Tipo de seguridad
  • El camino nilse maneja

No veo ninguna diferencia en la forma en que los dos manejan nil. Sea nulo el receptor o el argumento o ambos.
SayeedHussain

Sea lo que sea "esto" ya no existe: /
Jared Grubb

1
Gracias @JaredGrubb, encontré la nueva URL.
Ben Packard
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.