Можно ли вернуть копию собственности от геттера? - PullRequest
2 голосов
/ 16 июля 2009

У меня есть следующий простой класс:

@interface Article: NSObject {
    NSString *title;
}
@property (copy, nonatomic) NSString *title;
@end

@implementation

- (void)setTitle:(NSString *)aString {
    if ((!title && !aString) || (title && aString && [title isEqualToString:aString])) return;
    dirty = YES;
    [title release];
    title = [aString copy];
}

- (NSString *)title {
    return title;
}

@end

В моем приложении мне нужно сделать много вещей, таких как

Article *article= [objectsArray getObjectAtIndex:x];
NSString *title=article.title;
UILabel.text=title;
[title release];

Я знаю, что я должен позвонить удержать, когда я получу собственность:

NSString *title=[article.title retain];

Может быть, мне лень делать удержание, когда я получаю собственность. Или, если мне нужно сделать это десятки раз по всему приложению.

Могу ли я получить геттер для возврата копии?

- (NSString *)title {
    return [title copy];
}

Ответы [ 3 ]

7 голосов
/ 16 июля 2009

В некоторых случаях я предпочитаю вернуть копию имущества по соображениям безопасности. Например, если я пишу класс, который имеет свойство уникального идентификатора, то я "верню [[_uniqueID copy] autorelease]", чтобы не было никаких шансов, что другой класс сможет что-то сделать с уникальным идентификатором. В других случаях я просто верну сам объект, потому что это не имеет большого значения, если им манипулируют извне.

Кроме того, что касается этих методов получения, они не должны возвращать объекты со счетом удержания +1 (что и происходит). Во всяком случае, они должны возвращать объект напрямую или возвращать его с +0 счетом сохранения (retain / copy + autorelease). Это значительно упрощает управление памятью, чтобы сделать это таким образом. Если внешний объект должен удерживать возвращенный объект, то внешний объект должен отвечать за сохранение всего, что ему нужно.

1 голос
/ 17 июля 2009

На заметку Чака вы часто увидите, что свойства (NSMutableString *) возвращают копию объекта, а не ссылку на исходную строку. Как он указывает, это механизм безопасности, позволяющий вам иметь дело с «моментальным снимком» строки во время ее доступа.

В вашем конкретном примере, однако, похоже, что свойство title устанавливается один раз, а затем доступно для использования в качестве текста в UILabel.

Если это ваше единственное приложение, технически вам не нужно сохранять строку NSString при получении ее от средства доступа.

NSString * articleTitle = article.title;
label.text = articleTitle;
articleTitle = nil;

UILabel сохранит сохраненную копию строки, когда установлено ее свойство text. Вы можете 'обнулить' ссылку после установки текста, и вы получите тот же результат. Никакого дополнительного удержания / освобождения не требуется. (Хотя это может быть хорошей практикой)

1 голос
/ 16 июля 2009

Рекомендуется вернуть копию изменяемых свойств, чтобы другие объекты не могли заменить ваш объект из-под вас.

В случае простой строки NSStt, поскольку она неизменна, и copy, и retain делают одно и то же - они сохраняют строку и возвращают ее.

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