内存泄漏代码行

时间:2011-09-16 08:19:12

标签: iphone objective-c xcode

我的应用程序工作正常,但当我运行仪器检查泄漏时,它显示我在这行代码中泄漏,紫色带有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];
}

3 个答案:

答案 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];