我在方法中声明了一个本地字符串。我在同一个方法中释放字符串。如果发布该对象,我发现我的代码崩溃了。如果我没有释放字符串,代码就会成功运行。
我在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”。
我的代码出了什么问题?这不是发布它的正常方式吗?
答案 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];
}
答案 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的自动释放对象。
因此您需要将其转换为保留副本。