2011-03-02 6 views
0

私はtutorialから取られたのObjective-Cのコードのこの部分があります:私は、コードを記述する必要がありますなぜ私の質問があるアクセサーをいつ使用するのか、属性に直接アクセスするのはいつですか?

@interface FailedBankListViewController : UITableViewController 

<NSFetchedResultsControllerDelegate> { 
    NSFetchedResultsController *fetchedResultsController_; 
    NSManagedObjectContext *context_; 
} 

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController; 
@property (nonatomic, retain) NSManagedObjectContext *context; 

@end 

:私はこれを持って私の宣言ファイルで

- (NSFetchedResultsController *)fetchedResultsController { 
    if (fetchedResultsController_ != nil) { 
     return fetchedResultsController_; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"FailedBankInfo" 
               inManagedObjectContext:self.context]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"details.closeDate" ascending:NO]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

    [fetchRequest setFetchBatchSize:20]; 

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] 
                   initWithFetchRequest:fetchRequest 
                   managedObjectContext:self.context 
                   sectionNameKeyPath:nil 
                   cacheName:@"Root"]; 
    self.fetchedResultsController = theFetchedResultsController; 
    fetchedResultsController_.delegate = self; 

    [sort release]; 
    [fetchRequest release]; 
    [theFetchedResultsController release]; 

    return fetchedResultsController_; 
} 

をそのように、一度私たちはアクセサ使用したら、私たちは、直接属性にアクセス:

if (fetchedResultsController_ != nil) { 
    return fetchedResultsController_; 
} 

// AND 

self.fetchedResultsController = theFetchedResultsController; 

を、これは動作しません。

if (self.fetchedResultsController != nil) { 
    return self.fetchedResultsController; 
} 

// AND 

fetchedResultsController_ = theFetchedResultsController; 

アクセサーをいつ使用する必要がありますか?アクセサーを使用する必要があるのはいつですか?

ご協力いただきありがとうございます。

答えて

0

accessorは、プロパティのメソッドsettergetterです。 プロパティを作成するときにプロパティ値を設定して取得するには、アクセサメソッド(setterとgetterを意味します)が必要です。ここでは、コード内

このライン

self.fetchedResultsController = theFetchedResultsController; 

セッターが呼び出されます。

1

ライン

self.fetchedResultsController = theFetchedResultsController; 

は、プロパティの性質によって

[self setFetchedResultsController:theFetchedResultsController]; 

を呼び出すことに相当し、時々、クラス自体の内部setterメソッドをバイパスする正当なものである - 例えば、中dealloc - ほとんどの場合、オーナーシップやその他の関連する管理タスクを管理できるように、その1つの方法ですべての設定をルーティングする必要があります。

本当にここで直接ivarにアクセスしたい場合は、オブジェクトがretain -edであることを確認する必要があります。コードには、設定後にreleaseが表示されます。そしてsetFetchedResultsControllerにも他のものが起こっている可能性があります。しかし、コードなしで我々は推測することができます。 (例えば、私は、デリゲートとしてself回線設定がむしろここよりもセッターでなければならないことを考えて助けることはできません。)

を逆に、

return self.fetchedResultsController; 

ラインは

を呼び出すことと同じです
return [self fetchedResultsController]; 

後者は内部fetchedResultsController方法自体は悪い考えである理由は明白でなければなりません - あなたは無限の再で羽目になるガレス。

関連する問題