我提供了有关代码的更多信息。每隔5秒钟调用checkstatusthread()
。下面使用的ipItemsArray
对象存储来自服务器的XML。
// XMLAppDelegate.h
@interface XMLAppDelegate : NSObject <UIApplicationDelegate> {
NSMutableString *hostStr2;
NSData *dataURL2;
NSString *playlistdata;
}
@property (nonatomic, retain) NSMutableString *hostStr2;
@property (nonatomic, retain) NSData *dataURL2;
@property (nonatomic, retain) NSString *playlistdata;
@end
// XMLAppDelegate.m
-(void)checkstatusthread
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
hostStr2 = [[NSMutableString alloc] initWithFormat:@"http://%@/getplaylist.php?ip=%@",yourip,restip];
dataURL2 = [NSData dataWithContentsOfURL: [ NSURL URLWithString: hostStr2 ]];
playlistdata = [[NSString alloc] initWithData:dataURL2 encoding: NSASCIIStringEncoding];
ipItemsArray = [playlistdata componentsSeparatedByString:@"|^|"];
[hostStr2 release];
[playlistdata release];
status =[ipItemsArray objectAtIndex:0];
[status retain];
if([[ipItemsArray objectAtIndex:0]isEqualToString:@"0001"])
{
serverOutput1 =[ipItemsArray objectAtIndex:1];
[serverOutput1 retain];
nowplaying =[ipItemsArray objectAtIndex:2];
[nowplaying retain];
tracklocation=[ipItemsArray objectAtIndex:3];
[requestlocation retain];
requestlocation=[ipItemsArray objectAtIndex:4];
temp_app =[tracklocation intValue];
}
[serverOutput1 retain];
[nowplaying retain];
[serverOutput1 retain];
[nowplaying retain];
[tracklocation retain];
[requestlocation retain];
// checkstatus() called
[self performSelectorOnMainThread:@selector(checkstatus)
withObject:nil
waitUntilDone:false];
[pool drain];
}
- (void)dealloc {
[dataURL2 release];
[playlistdata release];
[ipItemsArray release];
}
当我在Xcode 4.2中运行泄漏工具时, NSArray *ipItemsArray = [playlistdata componentsSeparatedByString:@"|^|"];
行给了我内存泄漏。我已经尝试了所有可能的事情,但感觉需要添加一些东西。有人可以帮帮我。
这是泄漏对象的屏幕截图。另外我注意到我的应用程序没有调用Dealloc方法。
答案 0 :(得分:1)
实际上分析器指向你这行代码:
NSMutableString *hostStr2 = [[NSMutableString alloc] initWithFormat:@"http:// %@/getplaylist.php?ip=%@",yourip,restip];
您已分配但尚未发布。
你需要释放它。
答案 1 :(得分:1)
泄漏的对象是“状态”。我推断这是一个iVar。当你这样做时:
status =[ipItemsArray objectAtIndex:0];
[status retain];
这些行第二次执行时,先前存储的状态值未正确释放,因此泄漏。理想情况下你应该这样做:
if(status) {
[status release];
}
status =[ipItemsArray objectAtIndex:0];
[status retain];
这将解决仪器中显示的泄漏问题。 (假设没有使用ARC)
答案 2 :(得分:0)
你所做的一切都是正确的。并非泄漏仪器显示的每一个泄漏都是泄漏。
我建议您在第一步使用Clang Analyzer XCode - &gt;产品 - &gt;分析。这显示了一些潜在的泄漏。在此之后,您应该使用快照分析http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/