2009-11-09 129 views
7

我有這樣的:附加一個換行符到一個NSString

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

但我得到一個警告:從構建不同的Objective-C型

分配。

當我在設備上運行它,我得到:

Program received signal: "EXC_BAD_ACCESS". 

從GDB。

任何想法如何將一個換行符追加到NSString而不會收到警告或錯誤?

任何幫助表示讚賞// :)

+0

什麼是soapResults的類型和它在哪兒聲明? – Chuck 2009-11-09 08:14:38

+0

NSString,在.h中 – Spanky 2009-11-09 08:37:29

+0

由於您嘗試更改NSString對象,您無法使用!,因此嘗試在NSMutableString中使用該對象。 – evya 2013-03-19 14:15:53

回答

16

另一種方法是:[NSString stringWithFormat: @"%@\n", soapResults]即使邏輯是一樣的!

但是,即使在stringByAppendingString的情況下,它也會返回一個新的字符串,但它不會更改目標,因此您必須將新字符串分配給類NSString的新實例。

+0

工作,謝謝// :) – Spanky 2009-11-09 08:39:46

+6

除非你真的需要,否則不要使用格式字符串。當你可以使用-stringByAppendingString時解析它們是很昂貴的: – NSResponder 2009-12-18 19:49:52

0

您可能會遇到內存管理問題,soapResults可能是一個指向已被釋放的對象的雜散指針。很難說沒有看到更多的代碼,但檢查對象最初分配的位置是一個好的開始。

例如,如果它已通過[NSString stringWith ...]調用進行分配,則默認情況下它會自動釋放,即它將在運行循環結束時釋放,並且如果您想要保留它堅持下去。

1

您從-stringByAppendingString返回的對象是autoreleased。如果你想保留它,你必須保留它。如果您不保留它,下次嘗試訪問它時會收到內存異常。

確保發生這種情況的一種簡單方法是將「soapResults」聲明爲屬性,併爲其合成訪問器。

0

您正在使用正斜槓,這意味着它將忽略n,所以基本上你沒有追加任何東西。我認爲這可能是一個問題

2

你可以試試這個,它爲我工作:

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

`

2

我發現\ r作品比\ n使用NSString的時候更好。

所以:

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