我的应用程序工作正常,但当我运行仪器检查泄漏时,它显示我在这行代码中泄漏,紫色带有100.0%标记:
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
以下是包含此行的方法:
-(NSString*) languageSelectedStringForKey:(NSString*) key
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"zh" ofType:@"lproj"];
if(selectedLanguage==French)
{
FinalString = [[NSString alloc] initWithFormat:@"http://www.xyz.com/api_com.php?page_id=%d",IDValue];
url = [[NSURL alloc] initWithString:FinalString];
}
else if(selectedLanguage==German)
{
FinalString = [[NSString alloc] initWithFormat:@"http://www.x.com/api_com.php?page_id=%d",IDValue];
url = [[NSURL alloc] initWithString:FinalString];
}
else if(selectedLanguage==Nepali)
{
FinalString = [[NSString alloc] initWithFormat:@"http://www.xy.com/api_com.php?page_id=%d",IDValue];
url = [[NSURL alloc] initWithString:FinalString];
}
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[url release];
//Initialize the delegate.
parser = [[NewsParser alloc] initXMLParser];
//Set delegate
[xmlParser setDelegate:parser];
//Start parsing the XML file.
BOOL success = [xmlParser parse];
if(success)
NSLog(@"No Errors");
else
NSLog(@"Error Error Error!!!");
NSBundle* languageBundle = [NSBundle bundleWithPath:path];
NSString* str=[languageBundle localizedStringForKey:key value:@"" table:nil];
return str;
}
以下是我ViewDidLoad
方法,languageSelectedStringForKey
被调用。
- (void)viewDidLoad
{
// Do any additional setup after loading the view from its nib.
appDelegate = (ProgAppDelegate *)[[UIApplication sharedApplication] delegate];
IDValue = 1;
textLabel.text=[self languageSelectedStringForKey:@"Welcome to Advance Localization"];
[super viewDidLoad];
}
造成这种泄漏的原因是什么,以及如何解决?
这是dealloc方法: -
- (void)dealloc
{
[xmlParser release];
[parser release];
[nibLoadedCell release];
[super dealloc];
}
答案 0 :(得分:3)
你有没有打电话
[xmlParser release];
如果没有,您应该在不再需要时将其释放。也许在该行出现的同一类的dealloc方法中。
答案 1 :(得分:0)
您需要将NewsParser解析器设为实例变量并在dealloc中释放它。在上面,你启动它,但你不释放它。当然,你不能因为它是xmlParser的委托。因此,为了确保保留对象,然后正确释放,它必须是一个ivar。
答案 2 :(得分:0)
你永远不会释放FinalString(至少不会发布你发布的代码)
这是在URL中保存的,该URL由解析器保存:)
另外,您是否考虑过如果两次调用此函数会发生什么?
每次你说
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
你会泄漏以前的xmlParser;)
如果要分配实例变量,则必须记住释放前一个对象,即
[xmlParser release];
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];