0

我一直在慢慢学习 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];
4

2 回答 2

1

按照命名约定,您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];

}
于 2010-07-09T03:26:53.207 回答
1
NSMutableArray* arr = [dataFactory fetchAllDrivers];
[arr retain];
//Some code  where we use arr
[arr release];

按照惯例,从外部对象的方法返回的任何对象都是自动释放的。除了在属性中,您不需要保留它们。如果您仅arr在方法的本地范围内使用,则不需要保留/释放它。它是自动释放的,并且会在本地作用域结束后消失。

如果您需要arr在对象内部闲逛。您应该将其存储在保留属性中:

@property (nonatomic,retain) NSMutableArray *arr;

...然后将其与 self 表示法一起使用以确保保留:

self.arr=[dataFactory fetchAllDrivers];

...那么你只需要在类的dealloc方法中释放它。

让一个对象管理您的数据模型是一个很好的主意,但它不是“工厂”。Objective-c 不使用像 C++ 和类似语言这样的工厂。试图以这些方式思考会导致悲伤。对象应该被认为是“控制器”或“管理器”。

于 2010-07-10T13:56:11.183 回答