代码之家  ›  专栏  ›  技术社区  ›  spilliton

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

  •  0
  • spilliton  · 技术社区  · 15 年前

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

    在其他有垃圾收集器的语言中,这是非常微不足道的,但是在iPhone上的Objective-C中,我不知道该怎么做。

    - (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];
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   falconcreek    15 年前

    遵循命名约定,您的 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];
    
    }
    
        2
  •  1
  •   TechZen    15 年前
    NSMutableArray* arr = [dataFactory fetchAllDrivers];
    [arr retain];
    //Some code  where we use arr
    [arr release];
    

    arr 在方法的局部范围内,则不需要保留/释放它。它将自动释放,并在本地作用域结束后终止。

    如果你需要 阿里尔 在物体内部徘徊。应将其存储在保留的属性中:

    @property (nonatomic,retain) NSMutableArray *arr;
    

    ... 然后与self符号一起使用以确保保留:

    self.arr=[dataFactory fetchAllDrivers];
    

    ... 那么你只需要在课堂上发布它 dealloc 方法。

    让一个对象管理您的数据模型是一个非常好的主意,但它不是一个“工厂”。Objto-C不使用像C++和类似语言的工厂。试图用这些术语来思考会导致悲伤。相反,应该将对象看作“控制器”或“管理器”。