В чем отличие метода set, который устанавливает заданное свойство retain в Objective C? - PullRequest
1 голос
/ 20 сентября 2019

По словам разработчика сайта Apple: Практическое управление памятью , при реализации метода пользовательского набора свойство retain выглядит следующим образом:

@interface Counter : NSObject
@property (nonatomic, retain) NSNumber *count;
@end;

- (void)setCount:(NSNumber *)newCount {
    [newCount retain];
    [_count release];
    // Make the new assignment.
    _count = newCount;
}

Но многие веб-сайты предлагают первый шагдолжен быть выпущен.Например, в этом вопросе: target c - Явные методы получения / установки для @properties (MRC) - Переполнение стека , ответ дает другую реализацию.

 - (void)setCount:(NSNumber *)count {
    if (count != _count) {
        NSNumber *oldCount = _count;
        // retain before releasing the old one, in order to avoid other threads to
        // ever accessing a released object through the `_count` pointer.
        _count = [count retain];
        // safely release the old one.
        [oldCount release];
    }
}

Так что я сомневаюсь в разнице между этими двумя реализациями. Какой из них предпочтительнее и почему?

Спасибо за внимание и ответ.

Ответы [ 2 ]

3 голосов
/ 20 сентября 2019

Разница невелика, но если вы присваиваете себе значение, вы можете освободить объект:

id x = self.thing;
self.thing = x;

Таким образом, идеалом всегда было сначала сохранить new и выпустить старый после.

Включите ARC, и эта ерунда исчезнет.

0 голосов
/ 20 сентября 2019

Я действительно не вижу аргументов, почему retain будет вызываться после освобождения.Однако я мог бы найти аргументы, почему бы не выпустить его первым.

Если вы сначала отпустите старый объект, может случиться так, что новый объект будет освобожден и освобожден от него.Это была бы очень специфическая ситуация, но это могло произойти.Очевидно, не с NSNumber, но подумайте, например, что это UIView, а новое значение - это подпредставление старого значения.Теперь старое значение имеет ссылку на новое значение и сохраняет его.Освобождая старое значение, вы, несомненно, уменьшаете счет сохранения нового значения.Для того, чтобы количество сохранений упало до нуля и чтобы объект был освобожден, должна быть также особая ситуация, но, опять же, это может иметь смысл.

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

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