2011-01-05 32 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实例,并实际释放原始创建的实例。

相关问题