2011-04-20 38 views
1
+ (NSArray*) queryAllByEntityName:(NSString*) name AndSortColumn:(NSString*) ptyName{ 
//Define our entity to use 
NSEntityDescription *entity = [NSEntityDescription entityForName:name inManagedObjectContext:managedObjectContext]; 

//Setup the Fetch Request 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 

//Define How we will sort the result 
if (ptyName != nil) { 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:ptyName ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
    [request setSortDescriptors:sortDescriptors]; 
    [sortDescriptor release]; 
} 


//Fetch the record and Handle the error 
NSError *error; 
NSArray *FetchResults = [managedObjectContext executeFetchRequest:request error:&error]; 
[request release]; 
if (!FetchResults) { 
    //Handle the Error 
} 

//Save our fetched Data to a array 
return [[FetchResults copy] autorelease];} 

我曾經是一名java程序員,所以我仍然對內存管理不太熟悉。 我知道我必須返回一個autorelease對象,並且我做到了。 或者我的核心數據函數的問題不是NSCFString? THx for Answer!當我使用Intrument泄漏工具時,我得到了一個N​​SCFString對象泄漏,但我不知道哪裏出了問題

+1

有一定的點泄漏點? – Flipper 2011-04-20 02:35:16

+0

NSCFString在這段代碼中泄漏?無法找到任何.. – Krishnabhadra 2011-04-20 03:11:10

+0

我不認爲這是你的泄漏的確切原因..但FYI你不需要通過複製和autoreleasing返回FetchResult .. executeFetchRequest確實返回一個autorelease對象..你只是返回它。 return FetchResults;當你收到返回的數組時 .. NSArray * returnedArray = [[YourClassName queryAllByEntityName:...] retain]; //現在用returnedArray做你的東西... [returnedArray release]; – Krishnabhadra 2011-04-20 03:20:17

回答

1

在將它傳遞給方法之前,最有可能您保留了一個傳遞的字符串(nameptyName)。它在許多保留的地方範圍內到達,當本地範圍內存池耗盡時不能處理。

該代碼在技術上是正確的,但您可以使用一些改進。

當自動發佈的便利方法可以使用時,不要使用alloc - init。所以這個:

if (ptyName != nil) { 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:ptyName ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
    [request setSortDescriptors:sortDescriptors]; 
    [sortDescriptor release]; 
} 

...會更簡潔和安全地寫:

if (ptyName != nil) { 
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:ptyName ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
    [request setSortDescriptors:sortDescriptors]; 
} 

複製返回的數組是不必要的,因爲是自動釋放。所以這個:

return [[FetchResults copy] autorelease];} 

...應該是這樣的:

return fetchResults; 
} 
+0

Thx TechZen&All: 我明白了,我解決了這個問題。這個方法就是你所說的。 這是我第一次在stackOverFlow上發佈問題,真的很感謝你的回答! – javck 2011-04-22 06:10:15