0

ユーザー設定に応じて変更するインスタンス配列があります。を不変の NSArray に設定します。

@property (strong, nonatomic) NSArray *pointArray;

配列を変更する必要があるとき、私はこれを行ってきました:

-(void)changePointArray
{
    NSMutableArray *tempArray = [NSMutableArray arrayWithArray:self.pointArray];

    // Make changes

    self.pointArray = [NSArray arrayWithArray:tempArray];
}

これは容認できる慣行ですか、それともリークを作成していますか? 代わりに型キャストする必要があります:

self.pointArray = (NSArray *)tempArray;

または、NSMutableArray を NSArray に設定することについて心配する必要さえありますか?

self.pointArray = tempArray;
4

4 に答える 4

2

あなたの懸念は何ですか?このようなシナリオでは、原子性、誰かが配列を変更することに対するセキュリティ、またはそのどちらでもない、または両方に関心があるかもしれません。どちらにも関心がない場合は、プロパティを NSMutableArray にして、その場で変更してください。

アトミック性が心配な場合は、コピーを作成し、コピーを変更してから、それを交換する必要があります (ただし、もちろん、オブジェクトのすべてのユーザーは、一連の「アトミック」ポインターのプライベート コピーを作成することを知っている必要があります)。 "参照、各参照のプロパティの再参照)。

セキュリティのために、配列を不変の NSArray にし、プロパティを読み取り専用にする必要があります。

于 2012-10-18T17:34:36.193 に答える
1

は のサブクラスであるself.pointArray = tempArray;ため、これについて心配する必要はありません。もう少し多くのメモリが割り当てられるかもしれませんが、それはまったく問題ではありません。心配する必要はありません。NSMutableArrayNSArrayNSMutableArray

そしてもちろん、あなたはまだできるself.pointArray = [NSArray arrayWithArray:tempArray];

逆の場合は問題が発生しますが、

@property (strong, nonatomic) NSMutableArray *pointArray;

あなたがやろうとしていself.pointArray = tempArray;たのは、tempArrayがNSArray*

その場合にやろうとすると、self.pointArray = (NSMutableArray*)tempArray;問題が発生します

于 2012-10-18T17:04:57.087 に答える
1

いいえ、リークはありません (メモリ管理に関して)。

パブリック インターフェイスで相互配列を公開しないことが目標である場合、コードはまったく問題ありません。

ただし、ここで抽象化を気にしない場合 (またはそのプロパティが公開されていない場合) はNSMutualArray *、最初に type のプロパティを宣言する方が簡単です。

于 2012-10-18T17:13:22.527 に答える
0

コンテンツを変更または修正できる場合、最善の解決策は のNSMutableArray代わりに を使用することですNSArray

使用する特定の理由がある場合NSArrayは、次のコードが最適なソリューションです。

self.pointArray = [NSArray arrayWithArray:tempArray];
于 2012-10-18T17:09:29.720 に答える