Передача объектов Objective-C из NSArray в NSArray - PullRequest
3 голосов
/ 11 июля 2011

У меня есть NSArray содержащие объекты. Я хочу создать вторичный NSArray, содержащий только некоторые объекты в первом NSArray. У меня есть что-то вроде:

[array1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (something) {
        [array2 addObject:obj]; // (1)
    }
}];
[array1 release]; // (2)

Я думаю, что (1) увеличит retainCount объекта (что увеличит его с 1 до 2), затем (2) уменьшит его (что приведет к 2 с 1 для объектов, добавленных в array2 и от 1 до 0 для объектов, которые не были добавлены).

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

Это правильно?

1 Ответ

5 голосов
/ 11 июля 2011

Предполагая, что несовместимые объекты не сохраняются в другом месте, ваше предположение верно с учетом следующих предостережений:

  1. Обратите внимание, что retainCount обычно считается хитрой мерой, и лучшеговорить о проблеме - это вопрос о том, сохраняет ли array1 неконформные объекты или нет, без ссылки на retainCount.Причина в том, что retainCount может (и часто) отличается от того, что вы ожидаете.

  2. Также обратите внимание, что array2 должен быть экземпляром NSMutableArray, иначе вы не можете вызвать addObject:.

  3. В 95% случаев (составленная статистика) вы не должны использовать retain и release самостоятельно, но предпочитаете использовать autorelease (если объектNARCed, новое выделение сохранено или скопировано) или вообще ничего, если объект уже автоматически освобожден (например, [NSMutableArray array]).

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