ITは遊び

毎日パソコンのことばかり考えてる

Titanium MobileでTitaniumのオブジェクトにTitaniumのオブジェクト以外のオブジェクトを参照渡しさせるには

昨日:Titanium MobileでTitaniumのオブジェクトにTitaniumのオブジェクト以外のオブジェクトを参照渡ししても参照渡しにならない! - ITは遊び

試しにやってみたら出来ました。

// 普通にマイオブジェクトを作る
var myObject = {};
myObject.val = "before_val";

// Titaniumのオブジェクトを作り、マイオブジェクトを持たせる
var tiObject = Titanium.UI.createButton();
tiObject.myObject = myObject;

// 普通のJavascriptのオブジェクト、マイオブジェクトを持たせる
var stnObject = {};
stnObject.myObject = myObject;

// マイオブジェクトを更新する
myObject.val = "after_val";

// 昨日の復習
// Titaniumのオブジェクトの方は、参照で渡せていない!
Ti.API.info("TitaniumObject:" + tiObject.myObject.val);     // [INFO] TitaniumObject:before_val
// 普通のJavascriptのオブジェクトの方は、当然参照で渡せているので、値が変わる
Ti.API.info("JavaScriptObject:" + stnObject.myObject.val);  // [INFO] JavaScriptObject:after_val

// Titaniumオブジェクトには関数だけ渡してみる
(function(){
	var sansho = myObject;
	tiObject.getMyObject = function(){
		return sansho;
	};
})();

// 元のオブジェクトを変更する
myObject.val = "change_val_sansho";

// Titaniumオブジェクトでは、この方法なら変更できている。つまり参照渡し成功。
Ti.API.info("TitaniumObject:" + tiObject.getMyObject().val); // [INFO] TitaniumObject:change_val_sansho
// 普通のJavascriptオブジェクトでは、当然できている
Ti.API.info("JavaScriptObject:" + stnObject.myObject.val);   // [INFO] JavaScriptObject:change_val_sansho
tiObject.getMyObject().val = "change_val_sansho";

// 逆をやってみる。Titaniumオブジェクト
tiObject.getMyObject().val = "change_val_tiObject";

// Titaniumオブジェクトからの変更はできる
Ti.API.info("TitaniumObject:" + tiObject.getMyObject().val); // TitaniumObject:change_val_tiObject
// 普通のjavascriptオブジェクトでも、当然参照している
Ti.API.info("JavaScriptObject:" + stnObject.myObject.val);   // JavaScriptObject:change_val_tiObject

できるっちゃできるけど、ガベージコレクションが拾ってくれなくてメモリリークが発生しそうだよね…。