2011-01-13 6 views
20

He leído sobre "estática" en varias ocasiones, incluso antes de publicar esta pregunta. Todavía estoy buscando un "Aha".¿Por qué se usa la palabra clave estática en los identificadores UITableViewCell?

En el contexto de UITableView, estático aparece en Cell Identifiers en cada pieza de código que he visto. Por ejemplo, en un reciente cellForRowAtIndexPath:

static NSString *defaultIndentifier = @"Managed Object Cell Identifier"; 

Mi pregunta es ¿por qué necesitamos y usamos "estática"?

Respuesta

11

Para que solo se construya una vez. Si no es estático, lo hará uno cada vez que se envíe el mensaje (que es mucho)

+0

Si al "hacer uno cada vez" quiere decir "presionar un puntero constante en una variable de pila", claro. Pero es tan caro como decir 'int i = 3;', ya que el compilador compiló '@" Identifier "' en una constante. La única vez que la estática sería en realidad una ventaja es si la cadena se construye en tiempo de ejecución en lugar de usar una cadena constante. –

+1

Eso sigue siendo un beneficio. Corta dos ciclos de procesador cada vez que se ejecuta el método (lo que podría ser muchas veces). – ughoavgfhw

+0

@ughoavgfhw, sí, pero ¿no aumenta el tamaño de tu binario y hace que tu aplicación use más memoria? – ma11hew28

18

No hay ningún beneficio real aquí. En su mayoría, solo es una pista para el lector de que se utiliza el mismo valor para todas las celdas en este fragmento de código en particular. Como el identificador en sí es una cadena constante, se compila en un trozo inmutable de memoria y se hace referencia como el mismo puntero cada vez, p. no hay ningún costo involucrado en la construcción de la cadena, incluso si elimina la palabra clave static.

+0

Buena información sobre "el identificador en sí es una cadena constante" – Philip007

0

Supongo que al declarar la cadena como estática, cada vez que pasa a -dequeueReusableCellWithIdentifier:CellIdentifierforIndexPath: se usa el mismo puntero cada vez (como las variables declaradas estáticamente se asignan solo una vez en el montón, muy temprano en la ejecución del programa

[NSString -isEqualToString:] es muy probable que se implemente para realizar una comparación de puntero primero, seguido de una comparación de caracteres como la alternativa, que supuse que podría restar unos ciclos en cada iteración.

No hay mucho que ganar con esto, ya que (a) la repoblación de celdas de tabla opera en un conjunto de celdas típicamente muy pequeño, está bien optimizado y (b) la actualización de tabla es en ráfagas. luego no vuelve a suceder hasta que el usuario se desplaza o la lógica de la aplicación cambia el contenido: si termina llamando al -reloadTable 100 veces por segundo, es evidente que hay un problema con la lógica de la aplicación.

Sospecho que la palabra clave estática es una convención legada vestigial - tal vez en el día, Apple hash en el puntero, en lugar de realizar una comparación de cadena adecuada.

Cuestiones relacionadas