Когда использовать аксессор, а когда обращаться к атрибуту напрямую? - PullRequest
0 голосов
/ 02 марта 2011

У меня есть этот фрагмент кода в Objective-C, взятый из урока :

- (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_;
}

В моем файле декларации у меня есть это:

@interface FailedBankListViewController : UITableViewController 

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

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

@end

У меня вопрос, почему я должен писать такой код, как только мы обращаемся непосредственно к атрибуту, когда мы используем метод доступа:

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

// AND

self.fetchedResultsController = theFetchedResultsController;

и это не работает:

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

// AND

fetchedResultsController_ = theFetchedResultsController;

Я не понимаю, когда мне нужно использовать аксессор и когда мне нужно использовать аксессор?

Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Строка

self.fetchedResultsController = theFetchedResultsController;

эквивалентна вызову

[self setFetchedResultsController:theFetchedResultsController];

В зависимости от характера свойства, иногда допустимо обходить метод setter внутри самого класса -например, в dealloc - но большую часть времени вы хотите перенаправить все настройки с помощью этого единого метода, чтобы он мог управлять владельцем и любыми другими связанными задачами администратора.

Если вы действительно хотели получить доступ к ivarпрямо здесь, как минимум, вам нужно убедиться, что объект был retain соответствующим образом - в показанном вами коде release после установки.И вполне возможно, что в setFetchedResultsController происходят и другие вещи.Но без кода мы можем только догадываться.(Например, я не могу не думать, что строка, устанавливающая self в качестве делегата , должна быть в установщике, а не здесь.)

И наоборот, строка

 return self.fetchedResultsController;

эквивалентно вызову

 return [self fetchedResultsController];

Должно быть очевидно, почему последний является плохой идеей внутри самого fetchedResultsController метода - вы получаете бесконечный регресс.

0 голосов
/ 02 марта 2011

accessor - это методы setter и getter для свойства. поэтому, когда вы создаете свойство, тогда для установки и получения значений свойств вам нужны методы доступа (имеется в виду методы установки и получения).

в коде этой строки

self.fetchedResultsController = theFetchedResultsController;

здесь вызывается сеттер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...