如何释放在方法内创建的字符串?

时间:2011-01-05 07:48:06

标签: ios objective-c memory-management nsstring

我在方法中声明了一个本地字符串。我在同一个方法中释放字符串。如果发布该对象,我发现我的代码崩溃了。如果我没有释放字符串,代码就会成功运行。

我在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类中声明的NSMutable字符串。我应该如何释放“locStr”。

我的代码出了什么问题?这不是发布它的正常方式吗?

6 个答案:

答案 0 :(得分: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实例中的字符串属性设置为保留

答案 1 :(得分: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

答案 2 :(得分:1)

在您的代码中,调用[locStr release]被发送到从[locStr stringByAppendingFormat:@"%@",[result objectAtIndex:i]]返回的NSString实例。该代码实际上返回一个新的String实例,因此您的变量locStr现在指向新的NSString实例,您对原始实例的引用丢失

因此您使用[[NSString alloc] initWithString:@""]创建的NSString实例

stringByAppendingFormat返回的NSString是自动释放的,而您的[locStr release]会过度释放它。正如其他答案所示,您可以使用NSMutableString来避免在循环中创建大量NSString实例并实际释放原始创建的实例。

答案 3 :(得分:0)

无需分配/ init locStr。这应该可以解决问题:

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

答案 4 :(得分:0)

不要释放,使用自动释放。如果你需要退货,这就是你的方式。当存在自动释放池(在大多数情况下)时,它会自动释放。这就是stringByAppendingFormat之类的方法。

或者等等,当你喜欢这样的东西时,重要的是你在setter方法中保留了Object。最好使用像

这样的属性
{
NSString* thestring;
}

@property (nonatomic, retain) NSString* thestring;

@synthesize thestring;
<。>文件中的

答案 5 :(得分:0)

使用此

locStr = [[locStr stringByAppendingFormat:@“%@”,[result objectAtIndex:i]] retain]; 然后你可以像你一样发布它。

这里发生的事情是你通过stringByAppendingFormat方法获得string的自动释放对象。

因此您需要将其转换为保留副本。