Objective c 枚举时删除Cookie:安全吗?

Objective c 枚举时删除Cookie:安全吗?,objective-c,fast-enumeration,mutation,nshttpcookiestorage,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:co

鉴于此代码:

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

这不会引发异常,这意味着枚举期间cookie jar的变异是安全的。我想知道的是,为什么?这永远是安全的,还是由于某些实现细节可能会发生变化而碰巧是安全的?

实用答案:线索在标题中<代码>cookies定义为:

@property (readonly, copy) NSArray *cookies;
根据苹果的文档,“拷贝属性维护自己的拷贝”,即
cookies
阵列不是实时存储,而是拷贝。您从中收到的是快照

当您调用
deleteCookie
时,将创建新的Cookie列表,随后对
Cookie
的调用将返回一份当时最新的副本,但您以前保留的副本不受影响

在纯代码术语中,
copy
意味着
setCookies:
(如果存在;未公开确认或拒绝)将获取传入内容的
副本。因此,如果传入的内容是可变的,那么它将变为不可变的。所以无论你收到什么都是不变的。所以它肯定不会变异


从这两种推理中,你都没有变异,也无法变异你正在迭代的实际事物。您正在对cookie存储区进行变异,但会对其中一部分内容的副本进行迭代。

在此添加一个小细节-
setCookies:
不仅没有公开,实际上根本不存在。
readonly
属性的设置器不是由编译器合成的。@MorganChen您需要在运行时检查以完全确定它不存在;它们可能已在类扩展中重新声明,但未使用
只读
。当然,也可能是二传手自己写的。但是,不,我不应该说得好像我们知道二传手是存在的。好的观点@Tommy,我的评论应该是“可能存在,也可能不存在”。