2

鉴于这种代码:枚举时删除Cookie:安全吗?

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

这并不抛出异常,这意味着该cookie罐的枚举过程中的突变是安全的。我想知道的是,为什么?这是否总是安全的,还是由于某些可能改变的实现细节而变得安全?

回答

2

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

@property (readonly, copy) NSArray *cookies; 

每苹果的文档,即“复制属性维护自己的副本”,即cookies阵列是不是活的存储,它是一个副本。你从它收到的是快照。

当您拨打deleteCookie时,将创建新的cookie列表,并且随后调用cookies将返回一个当时最新的副本,但您仍然保留的那个副本不会受到影响。

在纯代码方面,copy意味着setCookies:(如果存在的话,它不是公开证实或否认)将于无论是在传递的copy因此,如果发生了什么传递是可变的,它会变得一成不变。所以无论你收到什么都是不变的。所以它绝对不会变异。

从任何一个推理,你都没有变异,也不能变异,你正在迭代的实际事物。您正在改变Cookie存储,但是会遍历其中一部分内容的副本。

+0

在这里添加一个小细节 - 不仅是'setCookies:'不公开暴露,它实际上根本不存在。 'readonly'属性的setter不是由编译器合成的。 – 2014-10-29 18:28:42

+0

@MorganChen你需要在运行时检查以确保它不存在;他们可能在类扩展中没有'readonly'重新声明。当然,或者只是自己写了二传手。但是,不,我不应该这样说,就好像我们知道制定者存在一样。 – Tommy 2014-10-29 19:04:57

+0

好点@汤米,我的评论应该说“可能存在也可能不存在”。 – 2014-10-29 19:07:10