繁体   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