2010-08-19 90 views
1

快速的問題,儀器公司報告在這裏泄漏...爲什麼Instruments在此代碼中報告內存泄漏?

MyViewController *myVC = [[MyViewController alloc] initWithNibName:@"myView" bundle:nil];  
[self.navigationController pushViewController:myVC animated:YES]; //<<<<---- !00% leak according to Instruments 
[myVC release]; 

我明白myVC由導航控制器保留的,所以我認爲導航控制器釋放他們時,認爲被彈出堆棧資產淨值?

此外,還有另一個棘手的一個在我的環之一,靜態分析儀在這裏報告一個潛在的泄漏...

//Walk through the scheduled alarms and create notifications 
NSMutableArray *fireDates = [[NSMutableArray alloc] init]; 
for(NSDate *fireDate in fireDates)   //<<<<---- Static analyzer is reporting potential leak here 
{ 
    UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
    if (localNotif == nil) 
    { 
     [fireDates release]; 
     return; 
    } 

    localNotif.fireDate = fireDate; 
    localNotif.timeZone = [NSTimeZone defaultTimeZone]; 

    localNotif.alertBody = [NSString stringWithFormat:@"%@", alarm.Label]; 
    localNotif.alertAction = NSLocalizedString(@"Launch", nil); 

    localNotif.soundName = UILocalNotificationDefaultSoundName; 

    localNotif.userInfo = infoDict; 
    localNotif.repeatInterval = NSWeekCalendarUnit; 

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 
    [localNotif release]; 

} 
[fireDates release]; 

我需要以某種方式釋放fireDate?

在此先感謝您的幫助!

+0

靜態分析儀一般都很好......也許不要忽略缺少的代碼... – Eiko 2010-08-19 21:16:02

+0

謝謝,Eiko,我剛剛更新了我的問題以包含缺少的代碼。你的想法? – BeachRunnerFred 2010-08-19 21:23:24

+0

你正在模擬器或設備上運行測試嗎?我注意到對模擬器,泄漏程序顯示錯誤的泄漏。 – 2010-08-19 21:35:39

回答

1

這些代碼片段都很好,就像片段一樣。如果你沒有看到你的完整代碼,就不可能說你是否在其他地方做一些愚蠢的事情。你有沒有釋放你的導航控制器(可能在你的應用代理-dealloc)?這是一個沒有多大意義的漏洞,但它可能是引發第一次警告的原因。


編輯:至於第二個片段中,代碼看起來不錯(雖然快捷回報的情況下會打擾一些程序員,誰更願意看到一個break語句)。靜態分析器可能會受到條件收益中缺少[localNotif release](儘管顯然沒有必要)的困擾。

+0

謝謝,seamus!不,我不會在我的應用程序委託的-dealloc中釋放導航控制器,因爲導航控制器是在我的筆尖mainwindow.xib nib文件中創建的。因此,我不應該在我的-dealloc中釋放它,對吧? – BeachRunnerFred 2010-08-19 21:21:08

+0

你有導航控制器的插座嗎? – christo16 2010-08-19 21:41:56

+0

@ christo16 - 不,我不這樣做,因爲我的導航控制器沒有實例變量。我只是使用[自我導航控制器]的一切。你的想法? – BeachRunnerFred 2010-08-19 21:45:00

0

在第一個片段中,什麼被泄漏?儀器會告訴你它被分配的位置,這通常不是對泄漏「負責」的線路(當然,因爲它會給你返回地址,而不是呼叫地址,所以線路號碼往往是關閉的)。我假設它是MyViewController被泄漏,並且這些工具實際上是在抱怨alloc(查看回溯,cmd -E我認爲)。

如果您單擊內存地址旁邊的箭頭(您可能需要點擊鼠標左鍵並將鼠標懸停在泄漏地址上;我不記得),您會看到所有的alloc/retain/release/autorelease/malloc/free/CFRetain/CFRelease調用該地址。忽略alloc之前的那些(那些發生在相同地址的前一個對象)。匹配保留和(自動)發佈。您可以將autorelease與相應的(延遲)版本相匹配,因爲在釋放NSAutoreleasePool時(這在堆棧跟蹤中很明顯)會發生延遲版本。尋找沒有匹配(自動)版本的保留。這是泄漏。

在第二種情況下,如果您告訴我們Clang SA告訴您什麼(點擊左邊的小三角並展開以向您顯示發生泄漏的控制流),它會有所幫助。

但我不認爲循環運行完全,因爲fireDates是空的。

相關問題