2

Учитывая этот код:Удаление файлов cookie при перечислении: безопасно?

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

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

ответ

2

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

@property (readonly, copy) NSArray *cookies; 

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

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

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

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

+0

добавление незначительной детали здесь - не только 'setCookies:' не публично раскрывается, на самом деле его вообще не существует. Сеттеры для свойств 'readonly' не синтезируются компилятором. –

+0

@MorganChen вам нужно будет проверить во время выполнения, чтобы быть абсолютно уверенным, что его не существует; они могут быть обновлены без «readonly» в расширении класса. Или, конечно же, просто написал сам сеттер. Но нет, я не должен был говорить, как будто мы знаем, что сеттер существует. – Tommy

+0

Хорошая точка @ Томми, мой комментарий должен сказать: «может или не может существовать». –