Удаление cookie при перечислении: безопасно?

Учитывая этот код:

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in cookieStorage.cookies) {
    if (/* my specific condition that is true multiple times */) {
        [cookieStorage deleteCookie:cookie];
    }
}

Это не вызывает исключения, подразумевая, что мутация файла cookie во время перечисления безопасна. Что я хочу знать, почему? Всегда ли это будет безопасным или просто безопасным из-за некоторых деталей реализации, которые могут измениться?

1 ответ

Решение

Практический ответ: подсказка в шапке; cookies определяется как:

@property (readonly, copy) NSArray *cookies;

Согласно документации Apple, "Свойства копии сохраняют свои собственные копии", то есть cookies Массив - это не живое хранилище, это копия. То, что вы получаете от него, является снимком.

Когда вы звоните deleteCookie, создается новый список файлов cookie и последующие вызовы cookies вернет обновленную копию, но та, что у вас все еще есть, не будет затронута.

В чистом виде, copy подразумевает setCookies: (если оно существует; оно не подтверждено или опровергнуто публично) copy из того, что было передано. Поэтому, если то, что было передано, было изменчивым, оно станет неизменным. Поэтому все, что вы получите, будет неизменным. Так что это определенно не будет мутировать.

Из любой части рассуждений вы не мутируете и не можете мутировать фактическую вещь, которую вы повторяете. Вы мутируете в магазине cookie, но перебираете копию одного его содержимого.

Другие вопросы по тегам