読者です 読者をやめる 読者になる 読者になる

【ActionScript】Arraycollection

結構な時間つまづいていたのですが…
状況はこんな感じです

  1. 自分でクラスを作る
  2. インスタンス作成
  3. インスタンスに値i代入 @for文内
  4. arraycollectionにaddItemAt()でインスタンス格納 @for文内
  5. arraycollection内表示

すると…
一番最後に格納したはずの要素が、全ての要素に入っているという状態でした。
Arraycollection内イメージ図
本来期待していた結果
こんな感じで下から積まれていくはず…が

あいうえお
かきくけこ
さしすせそ
たちつてと
実際の結果
あいうえお
あいうえお
あいうえお
あいうえお
こんな事になっていました…。 上書きされたのでもなく… 格納した直後にgetItem()で確かめてみても、ちゃんと正しいものが格納されているのに、for文の外でもう一度表示させると、何故か全て同じ中身になっていました。 挙動がおかしい時のソース
var save:TwitterPost = new TwitterPost();
var i:int;
	if(first){
        	for(i = 0;i<parseInt(json['results_per_page']);i++){
	    	    	save.text = json['results'][i]['text'];
	    		save.id = json['results'][i]['id'];
			save.from_user = json['results'][i]['from_user'];
        				
			save_comments_already.addItem(save);
			save_comments_new.addItem(save);

      		}
        }
正しく動いた時のソース
var save:TwitterPost = new TwitterPost();
var i:int;
	if(first){
        	for(i = 0;i<parseInt(json['results_per_page']);i++){
                        save = new TwitterPost();
	    	    	save.text = json['results'][i]['text'];
	    		save.id = json['results'][i]['id'];
			save.from_user = json['results'][i]['from_user'];
        				
			save_comments_already.addItem(save);
			save_comments_new.addItem(save);

      		}
        }
1行しか変わっていません。
save = new TwitterPost();
です。 for文の中でTwitterPost型変数(自分で定義したクラス)をnewしていなかったのが問題でした…。 そもそも、オブジェクト指向言語において、オブジェクト型の変数の事について忘れていました…。 (※ここから先間違っていたらご指摘下さい) newをしてオブジェクトを変数に格納するのではなく、メモリ上に生成されたインスタンスのアドレスが変数に格納されます。 今回、間違えたソースではnewしていなかったので、同じアドレスに、書き込んではArraycollectionに追加、同じアドレスに書き込んでarraycollectionに追加…という事になっていました。arraycollectionに格納されるのは、値ではなくアドレスなのに、newしないせいで、同じアドレスを何回も格納しているので、同じアドレスを持つインスタンスを何個も何個も入れていたわけです。 そうすると、当然、アドレスが同じわけですから、最後に格納した(と思っていた)データが追加されると、Arraycollectionに追加されている全てのオブジェクトが全く同じ値を持ってしまいます。 ちょっと説明がわかりにくいですが…私的な理解として、メモとしてはこんな感じです…。 つまりは、オブジェクト型は値自身ではなく、アドレスが格納されることを忘れていた。そして、そのせいで、値を格納したつもりが、同じアドレスを何回も追加していた。というミスでした。