2009-11-09 19 views
7

tengo esto:Añade una nueva línea a un NSString

if (soapResults != nil) { 
    soapResults = [soapResults stringByAppendingString:@"\n"]; 
    } 

Pero consigo una advertencia:

Asignación de distinto tipo de Objective-C en la construcción.

Cuando lo ejecuto en el dispositivo me sale:

Program received signal: "EXC_BAD_ACCESS". 

del BGF.

¿Alguna idea sobre cómo agregar una nueva línea a un NSString sin recibir una advertencia o un error?

Cualquier ayuda apreciada :) //

+0

¿Cuál es el tipo de soapResults y donde se declaró? – Chuck

+0

NSString, en .h – Spanky

+0

Obtiene esa advertencia porque intenta cambiar el objeto NSString, ¡no puede !, intente utilizar en su lugar en NSMutableString. – evya

Respuesta

16

Una alternativa es: [NSString stringWithFormat: @"%@\n", soapResults] incluso si la lógica es la misma!

Sin embargo, incluso en el caso de stringByAppendingString, devuelve una nueva cadena pero no cambia el destino, por lo que debe asignar la nueva cadena a una nueva instancia de la clase NSString.

+0

Eso funcionó, gracias // :) – Spanky

+6

No use cadenas de formato a menos que realmente lo necesite. Es costoso analizarlos cuando podría usar -stringByAppendingString: – NSResponder

0

Es probable que tenga problemas de administración de memoria, soapResults es probablemente un puntero vago a un objeto que ha sido desasignado. Es difícil de decir sin ver más código, pero verificar dónde se asignó originalmente el objeto es un buen comienzo.

Por ejemplo, si se ha asignado a través de una llamada [NSString stringWith ...], entonces se libera automáticamente de forma predeterminada, es decir, se lanzará al final del ciclo de ejecución y tendrá que retenerlo si desea aferrate a ello.

1

Objeto que obtiene de -stringByAppendingString: se libera automáticamente. Debe conservarlo si desea que persista. Si no lo conserva, obtendrá una excepción de memoria la próxima vez que intente acceder a él.

Una manera fácil de asegurarse de que esto ocurra es declarar "soapResults" como una propiedad y sintetizar los descriptores de acceso para ello.

0

Está utilizando barra diagonal, eso significa que va a ignorar n, por lo que básicamente no agrega nada. Creo que puede haber un problema

2

Puede probar esto, funciona para mí:

NSString *content1 = [messageObject valueForKey:@"content"]; 
NSString *seprator = @"\n----------------------\n"; 
NSString *myString = [NSString stringWithFormat:@"%@\n%@\n",seprator,content1]; 
content = [content stringByAppendingString:myString]; 

`

2

que he encontrado \ r funciona mejor que \ n cuando se utiliza NSStrings.

Así:

NSString *stringWithNewLine = [soapResults stringByAppendingString:@"\r"]; 
Cuestiones relacionadas