2011-09-16 266 views
2

我的應用程序工作正常,但是當我檢查是否有泄漏運行工具,它讓我在這行代碼泄漏,紫色與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

你是否在使用iOS 6的設備上進行泄漏分析?我有一個類似的泄漏,當用iOS 5分析設備時,泄漏消失。所以它可能指向Apple的源代碼中的問題? – iMathieuB

回答

3

你曾經打電話

[xmlParser release]; 

如果不是,則應在不再需要時釋放它。也許在該行出現的同一類的dealloc方法中。

+0

sory馬修爲我的不完整的信息我已經釋放xmlParser在我的dealloc方法PLZ你可以檢查我的dealloc方法我實際上更新我的信息上面...謝謝... – user768373

+0

相同的泄漏發生...沒有解決我的問題... – user768373

0

您需要使NewsParser解析器成爲實例變量並在dealloc中釋放它。上面,你初始化了它,但是你不釋放它。當然,你不能因爲它是xmlParser的委託。所以,爲了確保對象被保留,然後正確釋放,它必須是伊娃。

+0

它是一個實例變量(稱爲'parser'),它在'dealloc'方法中被釋放。 – deanWombourne

+0

哎呀,這是一次做兩件事情!那麼,我的猜測是xmlParser會在你的代碼的其他地方被初始化。例如,如果您的languageSelectedStringForKey方法被調用兩次,那麼對xmlParser的現有引用將被泄漏。就像任何其他對象,例如「解析器」一樣,在再次初始化之前,您沒有爲其檢查非零。 –

+0

我只是有同樣的想法:)請參閱我的答案編輯! – deanWombourne

0

你永遠不放開FinalString(至少在你發佈的代碼)

這是在URL,這是由解析器:)


還舉行舉行,你認爲是什麼如果這個函數被調用兩次會發生?

每次你說

xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 

你會泄漏以前XMLPARSER;)

如果你分配到一個實例變量,你必須記住要釋放以前的對象即

[xmlParser release]; 
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
+0

我已經做了這個[FinalString發佈],但同樣的泄漏發生... – user768373

+0

看我的編輯 - 我有另一個想法:)如果這個函數被調用兩次會發生什麼? – deanWombourne