Могу ли я использовать один и тот же NSZone дважды? - PullRequest
3 голосов
/ 20 февраля 2012

Пытаюсь впервые внедрить NSCopying, и у меня возник вопрос по поводу субаренды NSZone:

- (id)copyWithZone:(NSZone *)zone {
    MyClass *copy = [[[self class] allocWithZone:zone] init];

    copy.array = [[self.array mutableCopyWithZone:zone] autorelease];

    return copy;
}

В этом примере я дважды использую NSZone: сначала для выделения объекта, а затем снова для выделения копии массива. Это законно? Это необходимо? Я мог бы просто сделать mutableCopy, и я также смотрю на использование -initWithArray: copyItems: в качестве возможной альтернативы.

Какой лучший способ? Не стесняйтесь в любом случае ответить на вопрос: «Нужно ли, чтобы объекты результирующего массива были мелкой или глубокой копией?» Ключ для меня заключается в том, безопасно ли использовать NSZone два раза.

1 Ответ

4 голосов
/ 20 февраля 2012

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

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

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

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