枚举时删除Cookie:安全吗?

时间:2014-09-23 21:19:12

标签: objective-c fast-enumeration mutation nshttpcookiestorage

鉴于此代码:

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

这不会引发异常,这意味着在枚举期间cookie jar的变异是安全的。我想知道的是,为什么?这是否总是安全的,或者由于某些可能会改变的实施细节而恰好是安全的?

1 个答案:

答案 0 :(得分:2)

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

@property (readonly, copy) NSArray *cookies;

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

当您致电deleteCookie时,会创建新的Cookie列表,之后对cookies的调用将返回当时最新的副本,但您之前仍然保留的是受到了影响。

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

从任何一个推理中,你都没有变异,并且无法改变,实际上你正在迭代。你正在改变cookie存储,但是要遍历其中一个内容的副本。