1

私のコードがうまく機能していても、何か奇妙なことが起こることに気づきました。

2つの配列があると仮定します:passwordEnteredtempPasswordEntered

新しいものを入手した後passwordEntered、毎回これを行います。

 tempPasswordEntered=[passwordEntered mutableCopy]; 

それから私はきれいにします:

 [passwordEntered  removeAllObjects];

次に、次回(新しい場合passwordEntered)これを再度実行します。

 tempPasswordEntered=[passwordEntered mutableCopy]; 

したがってtempPasswordEntered、最後のだけがあり、passwordEntered両方はありません。初めて配列に4つの場所があった場合、2回目はまだ4つの場所があるので、私の質問は、コピーが配列を置き換えますか?あなたのようにそれの最後の場所に追加されていませんaddObjectか?

別のこと:retain代わりに使用する必要がありますか?

4

2 に答える 2

1

この行tempPasswordEntered=[passwordEntered mutableCopy];は変数の割り当てであり、他の割り当てと同様に、変数の値を完全に変更します。この場合、は、オブジェクトが1つしかないtempPasswordEnteredのコピーを指します。passwordEnteredそうです、他の割り当てと同じように、配列を置き換えます。

オブジェクトをに追加する場合はpasswordEntered、をtempPasswordEntered試してください[tempPasswordEntered addObjectsFromArray:passwordEntered]

mutableCopyあなたが望んでいるのはそうではないように聞こえますがretain、私はあなたの要件が正確に何であるかを本当に知らないので、これ以上言うことはできません。とにかくARCを使用しているはずです:)

于 2012-09-05T09:38:48.313 に答える
0
NSArray *retVal = [[NSArray alloc] initWithArray:fetchResults];
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults copy]];
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults retain]];

後者の2つは単純なリークです。1つ目は、コピーを作成する1つの方法ですが、retVal = [fetchResults copy]; コピーを作成するためのより良い方法です。

しかし、もちろん、コピーはまったく必要ありません。それは問題ではありません。クラッシュしないのは空の結果セットだけだと言い続けます。

これは、2つのことのいずれかを示しています。結果セットが破損しているか(可能性が低い)、結果セットに誤ってアクセスしている(可能性が高い)。

于 2012-09-05T09:57:55.247 に答える