*.h ファイルで配列を宣言します。
@interface aViewController: UIViewController { NSMutableArray *anArray; // 後でこれを何度も変更する必要があります。 } @終わり
*.m ファイルにメモリを割り当てます。
-(無効) viewDidLoad { anArray = [[NSMutableArray alloc] init]; }
テスト ボタンをクリックして配列をロードします (最終的には、クリックするたびに異なる値をロードする必要があります)。
anArray = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil];
そして、私はここでそれを解放します:
-(void) 割り当て解除 { [anArray リリース]; [スーパーdealloc]; }
それはすべて大丈夫に見えますか?
後でこのコードを実行するとクラッシュするため:
NSLog(@"%d", [anArray カウント]);
単純な「NSLog() とカウント」ですべてがクラッシュする理由がわかりません。
ダーク、
このように言いましょう: 私はポインター、配列、文字列、およびメモリについて大きな誤解を持っています。
見つけられるものはすべて読みましたが、(まだ) シンプルで明確でわかりやすい説明を見つける必要があります。
1つ提案できますか?(できれば10ページ未満の読書です。)このトピックだけを説明するリファレンスはありますか...そして「12年のコーディング経験があります...しかし、メモリやポインターの割り当てを扱ったことはありません」という観点から。 )
では、変数名はオブジェクトを参照する方法ではありませんか? では、なぜそれを持っているのですか?
私はこれを行う他の多くの言語に慣れています:
myString = "これ" myString = "それ" myInt = 5 myInt = 15
(もっと簡単かもしれません。)
これがこれを行う最も簡単な方法であるように私には見えます。(そして、それは機能しているように見えます。しかし、それは本当に正しいですか?)
最初に NSMutableArray にメモリを割り当てないでください。 メモリを繰り返し再割り当てしないでください。(配列の値を変更したとき。) 繰り返し解放しないでください。(配列の値を変更する前に。) プログラムを終了するときに解放しないでください。 しかし: 最初に割り当てるときは必ず RETAIN を使用することを忘れないでください (そして繰り返し再割り当て)新しい値を anArray 変数に。
anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil]; で配列をロードしていません。代わりに、それを新しいインスタンスに置き換えています。さらに悪いことに、参照が実際には制御していないエンティティによって所有されているインスタンスに置き換えています。
わお。だから私は 20 の配列を持つことができます.すべて同じ名前: anArray と呼ばれます.それらはすべて異なるでしょうか? (GLOBAL 配列のようなものはありませんか?)
古い値を消去するには、removeAllObject メソッドが便利です。一度に複数の値を追加するために使用できるミューテーションメソッドもあります。
だから...最初に「すべてのオブジェクトを削除する」必要があります...そして、すべての新しい値を再追加する1つのメソッドを呼び出すことができます。
anArray = [[NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil] 保持]; alloc/init シーケンスの代わりに。
わお。スペースを割り当てずに配列に格納することはできないと思いました。
本当に配列全体を置き換えるつもりなら、プロパティの使用を検討することをお勧めします
プロパティを使用してそれを行うにはどうすればよいですか?
このようなことをする正しい方法は何でしょうか:
> anArray = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil]; > anArray = [NSMutableArray arrayWithObjects:@"4", @"5", @"6", nil];
私がするように:
x = 12; x = 24;
わお。文字列、配列、メモリに関するすべてを完全に誤解しています。「簡単な方法」は、ONCEを割り当てることだと思いました...可変配列を使用して...必要なだけ変更して...一度解放します。
そうすることの問題は、この新しい配列が保持されないことです。
古い配列はなくなり、新しい配列を使用できると思います。(しかし、そうではないと思います。)
さらに、元の配列を解放していないため、メモリ リークが発生します。
古い配列は解放されるべきではないと思っていました...まだ終わっていません...新しい値を含むように変更したいだけです。(しかし、そうではないと思います。)
しかし、1 つは [anArray release] を使用することです。
私はそれが私が割り当てたメモリを解放する原因になると考えていました...(しかしそうではないと思います)...そして、より多くのメモリを再割り当てする必要があります。(しかし、そうではないと思います。)
anArray = [[NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil] 保持];
それを「保持」しなければならないので、私の下から消えないようにするには?(なぜそうなるのかわからない。最終的なdealloc呼び出しで...に指示するまで。)
別の、おそらくより正しい修正方法は、常に新しい配列を作成する代わりに、addObject: または addObjectsFromArray: NSMutableArray メソッドを使用することです。
私は1つの配列を作成したいだけです...そしてそれを好きなように使用してください。配列に追加したくありません。私はそれを私の新しい価値観に設定したい。