鉴于此代码:
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in cookieStorage.cookies) {
if (/* my specific condition that is true multiple times */) {
[cookieStorage deleteCookie:cookie];
}
}
这不会引发异常,这意味着在枚举期间cookie jar的变异是安全的。我想知道的是,为什么?这是否总是安全的,或者由于某些可能会改变的实施细节而恰好是安全的?
答案 0 :(得分:2)
实际答案:线索在标题中; cookies
定义为:
@property (readonly, copy) NSArray *cookies;
根据Apple文档,“复制属性维护自己的副本”,即cookies
阵列不是实时存储,它是副本。你收到的是快照。
当您致电deleteCookie
时,会创建新的Cookie列表,之后对cookies
的调用将返回当时最新的副本,但您之前仍然保留的是受到了影响。
在纯代码术语中,copy
暗示setCookies:
(如果它存在;它未被公开确认或拒绝)将采用copy
传入的任何内容。所以,如果是传入是可变的,它将变得不可变。所以无论你收到什么都将是不可改变的。所以它肯定不会改变。
从任何一个推理中,你都没有变异,并且无法改变,实际上你正在迭代。你正在改变cookie存储,但是要遍历其中一个内容的副本。