2

このコードを考えると:

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

これは例外をスローしません。これは、列挙中の Cookie jar の変更が安全であることを意味します。私が知りたいのは、なぜですか?これは常に安全なのですか、それとも実装の詳細が変更される可能性があるためにたまたま安全なのですか?

4

1 に答える 1

2

実用的な答え: 手がかりはヘッダーにあります。cookiesと定義されている:

@property (readonly, copy) NSArray *cookies;

Apple のドキュメントによると、「コピー プロパティは独自のコピーを維持する」、つまりcookiesアレイはライブ ストレージではなく、コピーです。そこから受け取るのはスナップショットです。

を呼び出すとdeleteCookie、Cookie の新しいリストが作成され、その後の の呼び出しでcookiesはその時点で最新のコピーが返されますが、以前に保持していたものは影響を受けません。

純粋なコード用語では、(存在する場合; 公に確認または拒否されていない) は、渡されたものは何でも取得することをcopy意味します。したがって、渡されたものが可変である場合、不変になります。したがって、受け取ったものは不変になります。だから絶対に変われない。setCookies:copy

どちらの推論からも、あなたは変異しておらず、変異することもできません。実際に繰り返していることです。Cookie ストアを変更していますが、その内容の 1 つのコピーを反復処理しています。

于 2014-10-29T17:55:22.443 に答える