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.arr=[dataFactory fetchAllDrivers];

dealloc...その後、クラスのメソッドでリリースするだけで済みます。

1つのオブジェクトでデータモデルを管理することは非常に良い考えですが、それは「ファクトリ」ではありません。Objective-cは、C++や同様の言語のようなファクトリを使用しません。それらの言葉で考えようとすると、悲しみにつながります。代わりに、オブジェクトは「コントローラー」または「マネージャー」と見なす必要があります。

于 2010-07-10T13:56:11.183 に答える