当我使用Intrument Leak Tool时,我得到了一个N​​SCFString对象泄漏,但我不知道哪里出错了

时间:2011-04-20 02:24:27

标签: objective-c core-data

+ (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!

1 个答案:

答案 0 :(得分: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;
}