如何在cocoa(iPhone)中创建用于核心数据访问的数据工厂的示例?
我一直在慢慢学习iPhone的开发,似乎一直在碰壁,我不知道如何以正确的方式做我想做的事情:( 基本上,我需要一个类来处理与数据层的所有交互,例如,从数据存储中获取一些对象列表的可变数组 在其他有垃圾收集器的语言中,这是非常简单的,但在iPhone上的Objective-C中,我不确定该怎么做 这是我们创建的DataFactory类上的一个示例方法。请注意我们不确定何时发布的注释如何在cocoa(iPhone)中创建用于核心数据访问的数据工厂的示例?,iphone,objective-c,memory-management,core-data,factory-pattern,Iphone,Objective C,Memory Management,Core Data,Factory Pattern,我一直在慢慢学习iPhone的开发,似乎一直在碰壁,我不知道如何以正确的方式做我想做的事情:( 基本上,我需要一个类来处理与数据层的所有交互,例如,从数据存储中获取一些对象列表的可变数组 在其他有垃圾收集器的语言中,这是非常简单的,但在iPhone上的Objective-C中,我不确定该怎么做 这是我们创建的DataFactory类上的一个示例方法。请注意我们不确定何时发布的注释 - (NSMutableArray*)fetchAllDrivers{ NSMutableArray *r
- (NSMutableArray*)fetchAllDrivers{
NSMutableArray *results = [[NSMutableArray alloc] init];;
if (self.appDelegate != nil) {
NSManagedObjectContext *context = [self.appDelegate managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
[request setEntity: entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];
[request setSortDescriptors: sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSError *error;
results = [[context executeFetchRequest:request error:&error] mutableCopy];
if (results == nil) {
//something went wrong
}
//Where should this be released??? Certainly not here!
[results release];
[request release];
}
else {
[NSException raise:@"Can't fetch b/c app delgate is nil!" format: @"!!!"];
}
return results;
}
呼叫代码,与我的评论相关:
NSMutableArray* arr = [dataFactory fetchAllDrivers];
[arr retain];
//Some code where we use arr
[arr release];
按照命名约定,您的
fetchAllDrivers
应该返回一个autoreleased
对象
- (NSMutableArray*)fetchAllDrivers
{
if (!self.appDelegate) {
// Big Problems Raise exception immediately if you want...
return nil;
}
NSManagedObjectContext *context = [self.appDelegate managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
[request setEntity: entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];
[request setSortDescriptors: sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSError *error = nil;
NSMutableArray *results = [[NSMutableArray alloc] initWithArray:[context executeFetchRequest:request error:&error] copyItems:YES];
if (error) {
// Something went wrong
[results release];
// Error handling code here
[request release];
return nil;
}
[request release];
return [results autorelease];
}
按照惯例,从外部对象的方法返回的任何对象都会自动删除。除了在属性中,您不需要保留它们。如果您仅在方法的局部范围中使用arr
,则不需要保留/释放它。它会自动删除,并在局部范围结束后消亡
如果需要将arr
挂在对象内部。应将其存储在保留属性中:
@property (nonatomic,retain) NSMutableArray *arr;
…然后将其与自标记一起使用以确保保留:
self.arr=[dataFactory fetchAllDrivers];
…然后只需在类'dealloc
方法中释放它
一个对象管理数据模型是个好主意,但它不是一个“工厂”。Objto-C不使用像C++和类似语言的工厂。试图用这些术语来思考会导致悲伤。对象应该被认为是“控制器”或“管理者”。.
啊,我想知道什么时候使用autorelease!因此,如果我正确地记住了我的内存管理学习,调用代码将需要在返回的对象中确定所有权,对吗?(请参阅我在问题底部添加的代码)您现在已获得groove。您应该检查arr是否为零。实际上,我们将在属性中存储arr(这是一个表的数据源),所以感谢您的解释!另外,当您收到一个自动释放对象时,不必保留在方法的范围内的花絮也是有意义的。谢谢!self.arr=[dataFactory fetchAllDrivers];