2011-04-13 52 views
0

我有兩個UITableViewControllers。我推到第二個,並在viewDidLoad中調用以下方法。第二次查看tableview後內存泄漏

我第二次處理這個視圖並回到第一個視圖,我得到一個內存泄漏。

儀器說,問題在以下方法的最後一行。

- (void)fetchRecords { 

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:@"Articulation" inManagedObjectContext:[self managedObjectContext]]]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"articulationGroup == %@", selectedArticulationGroup]; 
    [request setPredicate:predicate]; 

    static NSArray *sortDescriptors = nil; 
    if (!sortDescriptors) 
     sortDescriptors = [[NSArray alloc] initWithObject:[[[NSSortDescriptor alloc] initWithKey:@"text" ascending:NO] autorelease]]; 
    [request setSortDescriptors:sortDescriptors]; 

    NSError *error = nil; 
    NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error]; 
    if (!fetchResults) 
     NSLog(@"no fetch results ArticulationsViewController, error %@", error); 
    [request release]; 

    self.articulationsArray = [NSMutableArray arrayWithArray:fetchResults]; 

} 

我有不知道...睡前:'(

回答

0

嗯......我覺得自己像一隻鵝。

當我彈出回我的第一個tableViewController,我沒有釋放articulationsArray。

我用

- (void)viewDidUnload { 
    [self.articulationsArray release]; 
} 

當我應該一直在使用:

-(void)viewDidDisappear:(BOOL)animated { 
    [self.articulationsArray release]; 
} 

ViewDidUnload,從來沒有被調用。

感謝您的幫助。

0

嗯,我注意到兩件事情,這可能是正確的,但我想請教一下反正

首先。所有,你在if語句中詢問:if (!fetchResults)。這將意味着fetchResults可能不存在。但是,你嘗試初始化數組。將該行改爲self.articulationsArray = [[NSMutableArray alloc] initWithArray:fetchResults]]有什麼影響?

+1

self.articulationsArray = [[NSMutableArray alloc] initWithArray:fetchResults]如果articulationsArray是保留屬性,很可能會創建另一個泄漏。 – 2011-04-13 14:44:23

1

首先,如果您使用分配分支,則會泄漏sortDescriptors數組。 <肥皂盒>我強烈建議你使用大括號周圍所有的if/else塊,即使他們只有一條線 - 這些錯誤很難在事後發現< /肥皂盒>

請發表您的dealloc方法和伊娃宣言。

+0

我認爲相同,但sortDescriptors實際上是靜態的,並且預計會繼續存在。 – Joe 2011-04-13 14:39:42

+0

他應該釋放靜態sortDescriptors嗎?我認爲他們需要保留。 – 2011-04-13 14:54:35

+0

你是對的;我不認爲sortDescriptors需要被釋放。至於其餘部分,我們需要查看代碼的其他相關部分以瞭解泄漏。 – Rayfleck 2011-04-13 18:16:55

0

爲什麼您的sortDescriptors數組是靜態的?通常情況下,你會做這樣的事情:

NSSortDescriptor *textSort = [[NSSortDescriptor alloc] initWithKey:@"text" ascending:NO]; 

[fetchRequest setSortDescriptors:[NSArray arrayWithObject:textSort]]; 

[textSort release]; 

此外,if (!fetchResults)後,你不應該保存您的陣列,但是做這樣的事情:

if (!fetchResults) 
{ 
    NSLog(@"no fetch results ArticulationsViewController, error %@", error); 
} 
else 
{ 
    NSMutableArray *articulationsArray_tmp = [fetchResults mutableCopy]; 
    self.articulationsArray = articulationsArray_tmp; 
    [articulationsArray_tmp release]; 
} 

[request release]; 

同樣要注意,你可以設置不同articulationsArray 。每個人都應該小心這些NSMutableArray小號... :)

0

此塊是完全沒有必要的,這是危險的:

static NSArray *sortDescriptors = nil; 
if (!sortDescriptors) 
    sortDescriptors = [[NSArray alloc] initWithObject:[[[NSSortDescriptor alloc] initWithKey:@"text" ascending:NO] autorelease]]; 
[request setSortDescriptors:sortDescriptors]; 

任何靜態對象是危險的內存和你只在特殊情況下使用它們。爲什麼只用一個本地範圍指定一個數組到特定的地址/塊?所有這些都可以用一條線代替:

[request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortWithKey:@"text" ascending:NO]]]; 

......及其完成。

此行可能是不必要的,可能以後會出現問題:爲什麼你需要獲取對象的可變數組

self.articulationsArray = [NSMutableArray arrayWithArray:fetchResults]; 

?您無法直接在陣列中添加或移除任何內容,同時保持圖形完整無需重新進行修改。

剛:

self.articulationsArray = fetchResults; 

將正常工作在大多數情況下。

您創建的對象越多,創建泄漏的機會就越多。儘可能保持簡單。

+0

所有優點和適當注意。這是我第一次使用核心數據,在泄漏之後,我開始複製並粘貼各處的東西 - 我嘗試了一些不同的方法,希望能夠修復我的泄漏。 – 2011-04-14 13:46:59