2011-01-05 70 views
1

我已經在方法中聲明瞭一個本地字符串。我在同一個方法中釋放字符串。如果釋放該對象,我發現我的代碼崩潰。如果我不釋放字符串,代碼將成功運行。如何釋放在方法內創建的字符串?

我已經在viewdidappear中調用了該方法,以便在推入和彈出時調用該方法。控制檯中沒有打印任何內容。這裏是我的代碼

-(void)appendString{ 
NSString *locStr = [[NSString alloc] initWithString:@""]; 
for (int i=0;i<[result count]; i++) 
{ 
locStr=[locStr stringByAppendingFormat:@"%@",[result objectAtIndex:i]]; 
} 
[str setString:locStr]; 
[locStr release]; 
} 

我打電話從「viewDidAppear」中的「appendString」的方法。「STR」在.H class.How我應該放開「locStr」宣佈NSMutable字符串。

我的代碼出了什麼問題?這不是發佈它的正常方法嗎?

回答

2

試試這個:

-(void)appendString{ 
//stringWithString returns an autorelease object 
//so you don't need to worry about its memory management 
NSString *locStr = [NSString stringWithString:@""]; 
for (int i=0;i<[result count]; i++) 
{ 
//if your locstr is created by initWithString instead, 
//the following line is going to cause memory leak 
locStr=[locStr stringByAppendingFormat:@"%@",[result objectAtIndex:i]]; 
} 
[str setString:locStr]; 
//[locStr release]; 
} 

,並確保在您的STR實例屬性設置爲保留

0

不需要alloc/init locStr。這應該是訣竅:

-(void)appendString{ 
NSString *locStr = @""; 
for (int i=0;i<[result count]; i++) { 
locStr=[locStr stringByAppendingFormat:@"%@",[result objectAtIndex:i]]; 
} 
[str setString:locStr]; 
} 
0

不要釋放,使用autorelease。這是如果你需要退貨的方式。當有一個自動釋放池(在大多數情況下)它會自動釋放。這就是像stringByAppendingFormat這樣的方法。

或者等等,當你像這樣的東西時,重要的是你保留了setter方法中的Object。這是更好然後在.m文件使用屬性像

{ 
NSString* thestring; 
} 

@property (nonatomic, retain) NSString* thestring; 

@synthesize thestring; 

2

您可能需要使用的NSMutableString而不是創建多個字符串對象在遙遠的未來可能會或可能不會發布。

-(void)appendString 
{ 
    NSMutableString *locStr = [[NSMutableString alloc] initWithString:@""]; 
    for (int i=0;i<[result count]; i++) 
    { 
    [locStr appendFormat:@"%@",[result objectAtIndex:i]]; 
    } 
    [str setString:locStr]; 

    [locStr release]; 
} 

see

0

使用本

locStr = [[locStr stringByAppendingFormat:@ 「%@」,[結果objectAtIndex:I]]保留]; 然後你可以像你一樣釋放它。

這裏發生了什麼,你通過stringByAppendingFormat方法得到一個字符串的autorelease對象。

所以你需要將它轉換成保留副本。

1

在你的代碼,調用[locStr release]發送到從[locStr stringByAppendingFormat:@"%@",[result objectAtIndex:i]]返回NSString的實例代碼實際上返回一個新的String實例,讓你的變量locStr現在指向一個新的NSString實例和參照原來是丟失

所以這是[[NSString alloc] initWithString:@""]

創建NSString的實例中的NSString從stringByAppendingFormat返回會被自動釋放,你的[locStr release]會過度釋放。正如其他答案指出,您可以使用NSMutableString來避免在循環中創建大量NSString實例,並實際釋放原始創建的實例。

相關問題