2

鉴于此代码:

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

这不会抛出异常,暗示枚举过程中cookie jar的突变是安全的。我想知道的是,为什么?这是否总是安全的,还是由于某些可能发生变化的实现细节而恰好是安全的?

4

1 回答 1

2

实用答案:线索在标题中;cookies定义为:

@property (readonly, copy) NSArray *cookies;

根据 Apple 文档,“复制属性维护自己的副本”,即cookies阵列不是实时存储,它是一个副本。您从中收到的是快照。

当您调用 时deleteCookie,将创建新的 cookie 列表,随后的调用cookies将返回一个当时最新的副本,但您之前仍然持有的副本不受影响。

在纯代码术语中,copy暗示setCookies:(如果它存在;它未被公开确认或拒绝)将采用copy传入的任何内容。因此,如果传入的内容是可变的,它将变得不可变。所以你收到的任何东西都是不可变的。所以它绝对不会变异。

从任何一种推理来看,您都没有变异,也无法变异,您正在迭代的实际事物。您正在改变 cookie 存储,但遍历其内容的一个副本。

于 2014-10-29T17:55:22.443 回答