Pregunta

Tengo una aplicación para Mac OS X que admite complementos que deben cargarse al mismo tiempo.Algunos de estos complementos están construidos sobre un marco Cocoa que puede recibir actualizaciones en un complemento pero no en otro.Dado el método actual de Objective-C para el envío de funciones, cualquier llamada desde cualquier complemento a una rutina de Objective-C determinada irá a la misma rutina cada vez.Eso significa que el complemento A puede encontrarse adentro ¡Complemento B con una llamada trivial a Objective-C!Obviamente, lo que buscamos es que cada complemento interactúe con su propia versión del marco sobre el cual fue construido. I tener estado lectura algunos sobre Objective-C y esta necesidad particular, pero aún no han encontrado una solución definitiva.

Actualizar:Mi uso de la palabra "marco" anterior es engañoso:el marco es una biblioteca vinculada estáticamente, integrada en los complementos que la necesitan.Sin embargo, por la forma en que Objective-C maneja el envío, incluso estas piezas de código dispar vinculadas estáticamente se mezclarán en el despachador de Objective-C, lo que provocará consecuencias no deseadas.

Actualización 2:Todavía estoy un poco confuso sobre el respuesta proporcionada aquí, ya que no parece proponer tanto una solución como una hipótesis no probada.

¿Fue útil?

Solución 3

La mejor solución hasta el momento es un derivado de la idea propuesta en esta pregunta

Otros consejos

No puede hacer eso (al menos no de manera trivial), Objective-C actualmente no tiene noción de espacios de nombres y el tiempo de ejecución solo presenta una única tabla de distribución (global).

Tenga en cuenta que esto no es exclusivo de Objective-C, incluso los complementos basados ​​en C también pueden llamarse entre sí de manera bastante trivial, ya que todo está en el mismo espacio de direcciones.Es cierto que si le preocupa hacerlo accidentalmente, es menos probable debido a los espacios de nombres de dos niveles, pero esos no lo protegerán si algún complemento intenta explícitamente ingresar otro código.

Si realmente desea aislar complementos, puede crear procesos auxiliares separados en los que ejecute código que cargue el complemento y haga que su aplicación realice RPC entre ella y las aplicaciones auxiliares.Esto es lo que hace Safari en 64 bits en Snow Leopard, por ejemplo.Este enfoque tiene varios beneficios, pero es bastante complejo de implementar y la mayor parte debe realizarse usted mismo.

No creo que entiendo que comentas sobre "plugin A puede encontrarse en el interior plugin de B." Supongo que quiere decir que una vez que haya cargado algún marco depende de una vez, entonces todo el mundo va a usar en lugar de cargar su cuenta, y eso es correcto. Y eso es correcto si tiene algo así como espacios de nombres o no.

Este es el mismo problema que se enfrentaría si un plugin requiere una versión de OpenSSL, y otro plugin requiere otra versión de OpenSSL. No se puede cargar dos bibliotecas que proporcionan los mismos símbolos.

¿Entiendo el problema? Varios plugins requieren diferentes versiones, incompatibles del mismo marco? Mi enfoque, si es posible, sería cambiar el marco de una biblioteca estática y estáticamente vincular sus plugins para su marco. Si usted no está compartiendo el marco entre los plugins, a continuación, un marco realmente no es lo que quiere. Sólo quiere compilar el código (la vinculación estática). El punto de un marco es compartir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top