¿Está utilizando demasiadas variables estáticas en Objective-C una mala práctica?

¿El uso de variables estáticas los expone al peligro de ser modificables desde cualquier lugar? (En el context de Objective-C). En caso afirmativo, ¿alguien puede sugerir mejores alternativas para usar variables compartidas en todas las classs?

¿Está utilizando demasiadas variables estáticas en Objective-C una mala práctica?

Sí. Por supuesto, "demasiados" no se ha cuantificado y es subjetivo. En realidad, las variables globales / estáticas raramente son algo bueno, muy conveniente de introducir y muy difícil de depurar y eliminar. También es raro que sean un buen layout. He encontrado la vida mucho más fácil sin ellos.

¿El uso de variables estáticas los expondría a un peligro de ser modificables desde cualquier lugar? (En el context de Objective-C).

Depende de dónde se declaran y cómo se usan. Si tuviera que pasar una reference a otra parte del progtwig, entonces serían modificables desde 'cualquier lugar'.

Ejemplos:

Si los coloca para que solo un file pueda "ver" la variable (por ejemplo, en un file .m después de todo incluido), solo la implementación posterior puede usarlo (a less que pase una reference al mundo exterior).

Si declara la variable dentro de una function, se comparte entre cada traducción y se copy para cada traducción en C / ObjC (pero las reglas son muy diferentes en C ++ / ObjC ++).

En caso afirmativo, ¿alguien puede sugerir mejores alternativas para usar variables compartidas en todas las classs?

Solo evita usar globalmente por completo. Cree uno o más types / objects para save estos datos, luego pase una instancia de ellos a sus implementaciones.

Los singletones son el punto medio, ya que tienes algún tipo de abstracción basada en objects / variables globales. Los Singletons siguen siendo una molestia: están categorizados como variables globales y están prohibidos en mi base de código.

Las variables estáticas son locales para la unidad de traducción, por lo que las variables definitivamente no son modificables desde cualquier lugar. Globals, que están estrechamente relacionados con la estática en el sentido de que están asignados en la misma área de memory, son modificables desde cualquier lugar, y ese es su principal peligro.

Cuando se necesita un grupo de variables para acceder desde cualquier parte de su proyecto, el enfoque común consiste en implementar un singleton que contenga datos relacionados y que contenga methods para procesarlos. En las aplicaciones MVC implementadas en el Objetivo C, a menudo se accede al model a través de un model de object único.

Mi escenario implica una serie de variables estáticas declaradas en el file .h y se les asignan valores en methods específicos declarados en esos files .h.

Si declara estáticos en el encabezado, se "desconectan" entre sí: cada unidad de traducción (es decir, cada file .m) obtiene su propio set de estáticos del encabezado. Por lo general, esto no es lo que quieres.

Si hace estas variables globales, termina con una solución simple de C, no de Objective C. Debe colocar estas variables en una class como properties, y mover las implementaciones de funciones con ellas en los methods de su class. Luego, convierta la class en singleton tal como se describe en la respuesta enlazada arriba para get una solución que sea más fácil de entender que la solución correspondiente basada en globals.