tengo t o estoy de acuerdo tanto con el nodo ninja como con PeyloW porque técnicamente tienen ambos derechos. En realidad, eso no me ayuda mucho.
Preámbulo: Hay muchas matrices en el código que todas contienen solo un pero diferente tipo de datos, p. classA, classB, classC.
Problema: Puedo mezclar matrices fácilmente pasando el incorrecto a, p. algunos selectores porque son todos NSMutableArray. No hay comprobación estática, solo en tiempo de ejecución.
Solución - 1er intento: Hacer una subclase de NSMutableArray por lo compilador hace comprobación estática y advierte tipo de datos sobre el mal.
Eso es bueno porque el compilador le advierte incluso cuando pasa el tipo incorrecto a -addObject o -objectAtIndex cuando sobrecarga esos. Eso es malo porque no se puede crear una instancia de la superclase NSMutableArray de esta manera.
Solución - Segundo intento: Cree una nueva clase (proxy) de algún tipo, p. NSObject como para NSMutableArray y agrega un miembro de clase del tipo NSMutableArray.
Esto es bueno porque puede crear instancias de NSMutableClass y verificaciones del compilador cuando pasa el tipo incorrecto a -addObject o -objectAtIndex cuando sobrecarga esos.
Lo malo es que tiene que sobrecargar todos los selectores de NSMutableArray que utiliza, no solo los que difieren en clase que contiene la matriz.
Conclusión: Cuando se genera un código sofisticado que tiene muchos tipos de clase en sus matrices, créeme, vale la pena probar. Simplemente al hacer esto, el compilador me mostró varios errores que no reconocería hasta que lo enfrentare en tiempo de ejecución. O incluso peor, cuando el usuario final lo enfrentaría.
Me gustaría comentar que la implementación de una subclase NSMutableArray segura de tipo personalizado es una pérdida de tiempo. El tiempo dedicado a escribir esta subclase personalizada se habría gastado mejor al escribir algunas pruebas unitarias para validar que la lógica de la aplicación * real * sea sólida, sin agregarle más desorden. Su código adicional es solo más código para mantener, agregando solo más vectores de ataque para errores y fallas de seguridad sin agregar ningún beneficio real al usuario final. – PeyloW
@PeyloW: una buena posición teórica para tomar, pero en última instancia, existe un código del mundo real donde la seguridad del tipo puede ser útil. Como se describe en la publicación que escribí, traes cualquier falla al punto donde se inyecta, no a algún otro momento arbitrario. Eso redujo la superficie de ataque al eliminar la posibilidad de sustitución de objetos maliciosos. –
@PeyloW: también hay un código del mundo real que necesita una interfaz con CoreFoundation. A esto le importa si su implementación de matriz mutable es en realidad una subclase NSMutableArray u otra cosa; en ese punto su implementación tenía una mejor subclase NSMutableArray. –