2012-02-14 11 views
8

Estoy confundido mirando la documentación de Apple y leyendo los patrones de diseño de Cocoa. En la documentación de Apple para copyWithZone:, se lee: existeAnular copiar o copiarWithZone: ¿o ambos?

Este método por lo que los objetos de clase se pueden utilizar en situaciones en las que necesita un objeto que cumpla con el protocolo NSCopying. Para el ejemplo , este método le permite usar un objeto de clase como clave para un objeto NSDictionary . No debes anular este método.

Para copy se lee:

Este es un método de conveniencia para las clases que adoptan el protocolo NSCopying . Se genera una excepción si no hay implementación para copyWithZone :.

NSObject no es compatible con el protocolo NSCopying. Las subclases deben admitir el protocolo e implementar el método copyWithZone :. Una versión de subclase del método copyWithZone: debe enviar el mensaje al súper primero, para incorporar su implementación, a menos que la subclase desciende directamente de NSObject.

En los ejemplos en los Patrones de Diseño de cacao, anulan copyWithZone: y mutableCopyWithZone: pero no anulan copy cuando se cumpla con el protocolo NSCopying. ¿Es eso lo que debería hacer si quiero usar mi subclase personalizada en un NSDictionary como clave?

¿O bien anulo copy?

Del mismo modo, si hago [myClass copy], ¿eso llama a copyWithZone: o copy para que mi subclase personalizada? Gracias.

Respuesta

14

Es bastante simple: la implementación predeterminada de copy solo llama a copyWithZone: con un argumento NULO. Por lo tanto, siempre debe implementar copyWithZone:. Sin embargo, dado que las zonas de memoria no se utilizan (hasta donde yo sé) en iOS, debe ignorar la zona sin hacer ninguna suposición.

Editar: para elaborar, que puede aplicar copy así, pero se debe aplicar copyWithZone: porque nunca se sabe cuál de ellos NSDictionary llamarán en iOS 6.

0

Puede seguir usando la conveniencia superclase método tal como está, porque no hace más que llamar al copyWithZone: en cualquier caso.

Esto debería ser cierto para cualquier método de conveniencia. Debería averiguar qué método llaman y anularlo en su lugar.

También como se dijo anteriormente, las zonas ya no se usan en absoluto, pero el método todavía tiene ese parámetro por razones de compatibilidad e históricas.

Cuestiones relacionadas