0

私はViewController日付と呼ばれるプロパティを使用するクラスで作業しているNSArrayので、コードでは次を使用して作成します。

self.dates = someFunctionThatReturnsAnNSArray;

これは、検索可能な でself.dates使用されます。UITableView

self.datesまた、その配列のコピーを取得し、それを使用してAppDelegateglobalArray というプロパティを作成したいと考えています。だから私は私のものViewControllerをインポートし、そのメソッドをAppDelegate呼び出してから、これを行います:sharedApplication

AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate];
myDelegate.globalArray = self.dates;

私の質問は、これはこれを行う適切な方法ですか? コピーまたは保持はどうですか?

myDelegate.globalArray = [self.dates copy];
myDelegate.globalArray = [self.dates retain];

またはどうglobalArray = arrayWithArrayですか?

myDelegate.globalArray = [NSArray arrayWithArray:self.dates];

推奨される形式とその理由は?

4

2 に答える 2

0

質問の順番(暗黙の質問を含む)

self.dates = someFunctionThatReturnsAnNSArray は何をしますか?

プロパティが強力 (ARC) または保持 (非 ARC) と宣言されている場合、生成されたセッター (ドット表記で使用しているもの) は配列の保持カウントに追加されるため、そうではありません。ガベージコレクション。合成されたセッターを使用すると、そのステートメントでさらにメモリ管理の装飾を行う必要はありません。

AppDelegate でコピーをグローバルとして保持したい。それは良い考えですか?

「コピー」はオブジェクト指向では扱いにくい用語です。と言うと、同じアイテムの別の異なるコレクションを意味する場合があります[array copy]。それは、すべてのアイテムのコピーの新しいコレクションを意味する場合があります。おそらく、これらのどちらも必要ありません。私の推測では、別のスコープで使用できる配列へのポインターが必要なだけです。これは通常、配列の「割り当て」と呼ばれます。

いずれにせよ、アプリ デリゲートはおそらく保持するのに適した場所ではありません。アプリ デリゲートはシングルトンであるため、実際にはアプリのモデルにホームを持つ必要があるグローバルのゴミ捨て場にするのは魅力的です。

別のオブジェクトに同じ配列をプロパティとして持たせたいとしましょう。どうすればよいでしょうか?

その他のオブジェクト (アプリ デリゲートのように、その設計には同意しませんが) も、元のオブジェクトと同じ方法で、nonatomic、strong、retain などのプロパティを宣言できます。ドット演算子を使用して割り当てを行う場合、それ以上保持する必要はありません。

どうsomeArray = [NSArray arrayWithArray:self.dates]ですか?それはどう違うのですか?

コピーと同じですね。self.dates にある同じアイテムの新しい個別のコレクションを作成します。あなたの質問からの私の推測では、あなたは本当に同じデータを異なるスコープで共有したいだけだということです。そのために、copy や arrayWithArray は必要ありません。

于 2013-01-03T03:48:23.873 に答える
0

あなたの質問への答えは、問題の配列が変更可能か不変か、およびどのような種類の同時実行の考慮事項が行われているかによって多少異なります (配列は複数のスレッドによってアクセスおよび/または変更されます)。

また、ARC 以外の構文を使用しているようで、ARC の使用を検討することをお勧めします。

配列が不変の場合、配列のコピーを保持しても問題ありません。それらが変更可能な場合 (そして 2 つの配列を別々に追跡できるようにしたい場合) は、コピーを実行する必要があります。

グローバルに使用する必要がある 1 つのデータ セット (1 つ、マスター配列) が本当に意図されている場合は、マスター配列にアクセスするいくつかの便利なメソッドをビュー コントローラーに配置することをお勧めします (そして、2 つを別々にすることは避けます)。ポインター)。

于 2013-01-03T03:07:29.693 に答える