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