2012-03-19 13 views
5

Hola chicos, obtuve este código y XCode me advierte de "tipos de puntero incompatibles que inicializan NSString * __ strong con una expresión de tipo UITextField".Advertencia: tipos de puntero incompatibles inicializando 'NSString * __ strong' con una expresión de tipo 'UITextField'

NSString *name = (UITextField *)searchText.text; 

pero éste está bien

NSString *name2 = [(UITextField *)searchText text]; 

y éste está muy bien también

NSString *name3 = [(UITextField *)searchText.text mutableCopy]; 

Tengo dos preguntas:

  1. Estoy confundido con obj.* y [obj *]
  2. ¿Por qué la "mutableCopy" es correcta este caso?

No sé cómo buscar en la documentación del desarrollador de Apple estas preguntas; por favor ayuda.

Respuesta

8

En la primera versión, debido a la precedencia del operador, está emitiendo searchText.text a UITextField*, lo que desea hacer es probablemente emitir searchText;

NSString *name = ((UITextField *)searchText).text; 

En la segunda versión que no tienen el punto, por lo que el compilador entiende su elenco ser searchText fundición a UITextField y enviar el mensaje de texto a la misma. En otras palabras, exactamente correcto.

El último caso es un poco complicado ya que involucra el tiempo de ejecución y el tiempo de compilación. Como yo lo entiendo;

  • Ha emitido searchText.text en un UITextField*. El tiempo de ejecución aún sabe que el objeto es un NSString y el mensaje mutableCopy que existe en ambos irá al método correcto [NSString mutableCopy] de todos modos y creará/devolverá una copia mutable del NSString para que el tiempo de ejecución funcione bien.
  • Desde mutableCopy devuelve id (haciendo referencia a un NSMutableString), la asignación a un NSString está bien por el compilador (el ID se puede asignar a cualquier cosa), por lo que el tiempo de compilación está bien.

Una pregunta, ¿qué es searchText originalmente? Que la última versión compilada sin advertencia indica que ya es un UITextField*, o al menos un tipo que puede tomar el mensaje text. Si es así, debería poder hacer;

NSString *name3 = [searchText.text mutableCopy]; 
1

En el segundo y el tercer ejemplo, el elenco solo funciona en searchText. Entonces con estos está enviando un mensaje a un objeto UITextField.

En el primero, el molde se aplica a la totalidad de searchText.text. La asignación de un objeto UITextField a las variables NSString no es lo que desea. El código que está buscando es:

NSString *name = ((UITextField *)searchText).text; 

El mensaje mutableCopy devuelve una copia de la cadena como un objeto NSMutableString, que puede ser asignado a un NSString como NSMutableString deriva de ella.En este caso, usar el mensaje 'copiar' es igual de bueno.

Espero que ayude.

Cuestiones relacionadas