【问题标题】:Cookie deletion while enumerating: safe?枚举时删除 Cookie:安全吗?
【发布时间】:2014-09-23 21:19:11
【问题描述】:

鉴于此代码:

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

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

【问题讨论】:

    标签: objective-c fast-enumeration mutation nshttpcookiestorage


    【解决方案1】:

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

    @property (readonly, copy) NSArray *cookies;
    

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

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

    在纯代码术语中,copy 意味着 setCookies:(如果存在;它未公开确认或拒绝)将采用 copy 传入的任何内容。因此,如果传入的内容是可变的,那么它'将变得一成不变。所以你收到的任何东西都是不可变的。所以它肯定不会变异。

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

    【讨论】:

    • 在这里添加一个小细节——setCookies: 不仅没有公开曝光,它实际上根本不存在。 readonly 属性的设置器不是由编译器合成的。
    • @MorganChen 您需要在运行时检查以完全确定它不存在;他们可能在类扩展中没有 readonly 的情况下重新声明。当然,或者只是自己编写二传手。但是,不,我不应该说我们知道 setter 存在。
    • 好点@Tommy,我的评论应该说“可能存在也可能不存在”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2016-12-31
    • 1970-01-01
    • 2010-10-05
    • 2017-01-07
    • 2014-09-09
    • 1970-01-01
    相关资源
    最近更新 更多