+ (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!
答案 0 :(得分:1)
在将其传递给方法之前,您很可能已经保留了其中一个传递的字符串(name
或ptyName
)。它到达本地范围有很多保留,当本地范围内存池耗尽时不能处理。
代码在技术上是正确的,但您可以使用一些改进。
自动释放的便捷方法可以使用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;
}