Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在cocoa(iPhone)中创建用于核心数据访问的数据工厂的示例?_Iphone_Objective C_Memory Management_Core Data_Factory Pattern - Fatal编程技术网

如何在cocoa(iPhone)中创建用于核心数据访问的数据工厂的示例?

如何在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

我一直在慢慢学习iPhone的开发,似乎一直在碰壁,我不知道如何以正确的方式做我想做的事情:(

基本上,我需要一个类来处理与数据层的所有交互,例如,从数据存储中获取一些对象列表的可变数组

在其他有垃圾收集器的语言中,这是非常简单的,但在iPhone上的Objective-C中,我不确定该怎么做

这是我们创建的DataFactory类上的一个示例方法。请注意我们不确定何时发布的注释

- (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];