2009-11-09 4 views
7

J'ai ceci:Annexer une nouvelle ligne à un NSString

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

Mais je reçois un avertissement:

Attribution de distinct de type Objective-C sur la construction.

Lorsque je le lance sur l'appareil je reçois:

Program received signal: "EXC_BAD_ACCESS". 

de gdb.

Avez-vous des idées pour ajouter un saut de ligne à un NSString sans avoir d'avertissement ou d'erreur?

Toute aide appréciée :) //

+0

Quel est le type de soapResults et où est-elle déclarée? – Chuck

+0

NSString, dans le .h – Spanky

+0

Vous obtenez cet avertissement parce que vous essayez de modifier l'objet NSString, vous ne pouvez pas!, Essayez d'utiliser à la place dans NSMutableString. – evya

Répondre

16

Une alternative est: [NSString stringWithFormat: @"%@\n", soapResults] même si la logique est la même!

Cependant, même dans le cas de stringByAppendingString, il renvoie une nouvelle chaîne mais ne change pas la cible. Vous devez donc affecter la nouvelle chaîne à une nouvelle instance de la classe NSString.

+0

Cela a fonctionné, merci // :) – Spanky

+6

N'utilisez pas de chaînes de format sauf si vous en avez réellement besoin. Il est coûteux de les analyser lorsque vous pouvez simplement utiliser -stringByAppendingString: – NSResponder

0

Vous risquez d'avoir des problèmes de gestion de la mémoire, soapResults est probablement un pointeur perdu vers un objet qui a été désalloué. Difficile à dire sans voir plus de code, mais vérifier où l'objet a été initialement attribué est un bon début. Par exemple, s'il a été alloué via un appel [NSString stringWith ...], il est auto-libéré par défaut, c'est-à-dire qu'il sera libéré à la fin de la boucle d'exécution et vous devrez le conserver si vous voulez tenez-vous-y.

1

L'objet que vous récupérez de -stringByAppendingString: est autoeleased. Vous devez le conserver si vous voulez qu'il persiste. Si vous ne le retenez pas, vous obtiendrez une exception de mémoire la prochaine fois que vous tenterez d'y accéder.

Un moyen facile de s'assurer que cela se produit est de déclarer "soapResults" en tant que propriété, et de synthétiser les accesseurs pour cela.

0

Vous utilisez une barre oblique, c'est-à-dire que vous ignorerez n, donc vous n'ajoutez rien. Je crois que peut-être un problème

2

Vous pouvez essayer, ça marche pour moi:

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

`

2

que j'ai trouvé \ r fonctionne mieux que \ n lors de l'utilisation NSStrings.

Alors:

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