2009-11-09 4 views
7

ho questo:Aggiungere una nuova riga a un NSString

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

Ma ottengo un avvertimento:

Assegnazione da distinta di tipo Objective-C su build.

quando l'eseguo sul dispositivo ottengo:

Program received signal: "EXC_BAD_ACCESS". 

da gdb.

Delle idee come aggiungere una nuova riga a un NSString senza ottenere un avvertimento o un errore?

Qualsiasi aiuto apprezzato // :)

+0

Qual è il tipo di soapResults e dove si dichiara? – Chuck

+0

NSString, nel .h – Spanky

+0

si ottiene che avvertimento perché si tenta di modificare oggetto NSString, non è possibile !, provare ad usare invece in NSMutableString. – evya

risposta

16

Un'alternativa è: [NSString stringWithFormat: @"%@\n", soapResults] anche se la logica è la stessa!

Tuttavia, anche nel caso di stringByAppendingString, restituisce una nuova stringa ma non modifica la destinazione, pertanto è necessario assegnare la nuova stringa a una nuova istanza della classe NSString.

+0

Funzionante, grazie // :) – Spanky

+6

Non utilizzare le stringhe di formato a meno che non sia effettivamente necessario. È costoso analizzarli quando puoi semplicemente usare -stringByAppendingString: – NSResponder

0

Si rischia di avere problemi di gestione della memoria, soapResults è probabilmente un puntatore randagio a un oggetto che è stato deallocato. Difficile dire senza vedere altro codice, ma controllare dove l'oggetto è stato originariamente allocato è un buon inizio.

Ad esempio, se è stato assegnato tramite una chiamata [NSString stringWith ...], viene automaticamente annullato automaticamente, ovvero verrà rilasciato alla fine del ciclo di esecuzione e sarà necessario conservarlo se si desidera tienilo stretto.

1

L'oggetto si torna da -stringByAppendingString: è autoreleased. Devi mantenerlo se vuoi che persista. Se non lo trattieni, riceverai un'eccezione di memoria la prossima volta che proverai ad accedervi.

Un modo semplice per assicurarsi che questo accade è di dichiarare "soapResults" come una proprietà, e sintetizzare di accesso per esso.

0

Si utilizza in avanti slash, questo è significa che sarà ignorando n, in modo sostanzialmente si si desidera aggiungere i nulla. Credo che possa essere un problema

2

Si può provare questo, per me funziona:

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

`

2

ho trovato \ r funziona meglio di \ n quando si utilizza NSStrings.

Quindi:

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