Uso de la categoría Objective-C para evitar el error de compilation

Hice algo un poco desagradable hoy.

Todos nuestros controlleres de vista henetworkingan de dos controlleres de vista principales diferentes, digamos XXXViewController y YYYViewController. XXXViewController a su vez henetworkinga de TrackedUIViewController , que es una class proporcionada en el SDK de Google Analytics para que todos sus controlleres de vista puedan henetworkingar de él y rastrearlos fácilmente.

Sin embargo, YYYViewController henetworkinga de un tipo diferente de controller de vista. Ah, y es un código de fuente abierta que realmente no quiero cambiar.

¿Cuál es el problema aquí? No podemos rastrear a ninguno de los niños YYYViewController porque no podemos acceder a los methods proporcionados en TrackedViewController, ya que son privados.

No quiero modificar la fuente proporcionada en el SDK de Google Analytics. Entonces, ¿qué hice? Cree una categoría que exponga esos methods, solo para evitar el error de compilation.

La desventaja obvia de esto es que el código fuente GA cambia, puede romperse, pero será bastante fácil de detectar.

Me preguntaba qué otros problemas podría enfrentar haciendo esto, y si ustedes pueden pensar en un enfoque mejor.

Gracias

Puede upload en la cadena de inheritance de YYYViewController, ver a su vez de qué class henetworkinga. Si es UIViewController, simplemente cambie esa superclass en particular a TrackedUIViewController en la fuente y está listo para ir.

Ejemplo para una mejor comprensión: suponga que YYYViewController henetworkinga de ZZZViewController , que a su vez henetworkinga de UIViewController . Ahora puede cambiar la superclass de ZZZViewController de UIViewController a TrackedUIViewController , ya que TrackedUIViewController henetworkinga de UIViewController , no se perderá ninguna funcionalidad, pero, por arte de magia, toda su class YYYViewController se volverá rastreable.

Espero que esto ayude 🙂

Ya mencionaste el mayor riesgo de usar API indocumentadas: los cambios a la API están fuera de tu control y pueden romper tu lógica, por ejemplo, si se eliminan / renombran methods o si su comportamiento deja de coincidir con tus expectativas.

Desde el punto de vista puramente técnico, no veo más problemas, ya que en Objective-C todos los methods son públicos. Mientras sigan existiendo, puede continuar llamándolos.

Diría que el problema raíz es una subclass excesiva. Mantenga las jerarquías de controller de vista a poca profundidad. Usa la composition en lugar de la subclass. Si debe subclass, asegúrese de que la funcionalidad que proporciona una class se pueda activar y desactivar por sus subclasss.