簡體   English   中英

在appcelerator Titanium中進行數據綁定的最佳做法是什么,避免內存崩潰

[英]What are the best practises for data binding in appcelerator titanium and avoid memory crash

我一直在使用自定義事件來處理與鈦appcelerator的數據綁定,對於給定的對象ID(所有對象唯一)和傳遞新值的屬性,使用稱為RefreshComp的事件。 這個新值可能來自推送通知,您希望在iphone應用中編輯的對象要傳播到所有伴奏等。

Titanium.App.fireEvent(RefreshComp, {
    refreshid : objectId + '-' + attribute,
    value : newvalue
 });

function registerEvent(objectId,attribute,eventHandler){
    Titanium.App.addEventListener(RefreshComp, function(e) {
        if((e.refreshid === (objectId + '-' + attribute))) {
            eventHandler(comp, e.value);
        }
    });
}

然后您的eventHandler函數可能像

function eventHandler(comp,newvalue){
    comp.value = newvalue;
}

或更復雜(例如更改背景等...)

我的觀點是,這會使comp綁定到全局上下文,從而導致對象無法釋放。 我嘗試將自定義事件附加到組件本身,但是它不起作用。 結果,我得到了崩潰的應用程序

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x242424cf

因為綁定引用的組件仍然在IOS端的內存中,但是當TiViewProxy.m在_hasListeners中調用父函數時,它無法在內存中找不到沒有任何關聯對象的父對象,並且該父對象已經被從內存中刪除

我已經用谷歌搜索並查看了appcelerator的git rep,但是沒有這個例子。

有數百萬種刷新特殊組件的方法。 我通常傾向於使用一種干凈簡單的結構,其中每個js文件都由一個ui元素組成。 這提供了一種管理用戶界面的干凈方法。 如果您的組件偵聽諸如globalRefreshEvent之類的事件,它將刷新自身。

createMyComponent = function(_args){

   var myComp = Ti.UI.createWhatEver({
      property0 = _args.prop0 || "defaultValueForProp0"
      property1 = _args.prop1 || "defaultValueForProp1"
      value = _args.value || "defaultValueForValue"
  });

  myComp.refreshValue = function(_newValue){
       myComp.value = _newValue;
  };

  Ti.App.addEventListener('globalRefreshEvent',function(e){
       myComp.refreshValue(e.value)
  });

  return myComp;
};

像這樣創建您的伴奏:

var comp = createMyComponent();
view.add(comp);

希望它能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM