Como [NSArray arrayWithArray: self.container.objects ]
no es una constante en tiempo de compilación, es una expresión que debe evaluarse en tiempo de ejecución. En C y Objective-C, static
las variables dentro de las funciones se deben inicializar con en tiempo de compilación constantes, mientras que C++ y Objective-C++ son más indulgentes y permiten constantes que no son de compilación.
Cualquiera de compilar el código como Objective-C++ o refactorizar en algo como esto:
static NSArray *localArray = nil;
if (localArray == nil)
localArray = [NSArray arrayWithArray: self.container.objects ];
que es bastante similar al código que el compilador generaría bajo el capó de una variable static
inicializado con una constante de tiempo de no compilación (en realidad, utilizaría una segunda bandera global que indica si el valor se inicializó, en lugar de utilizar un valor centinela como nil
aquí; en este caso, asumimos que localArray
nunca será nil
). Puede consultar el desensamblador de su compilador si lo desea.
http://stackoverflow.com/q/6143107/94687 fue la misma pregunta. Lo único especial en su pregunta es la adición explícita de la palabra clave 'static' a una variable dentro de un cuerpo de función (pero esto debe ser equivalente a tener una variable en el ámbito global, como en esa pregunta). –