Удаление 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, но перебираете копию одного его содержимого.