在appcelerator titanium中进行数据绑定并避免内存崩溃的最佳做法是什么

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

本文关键字:崩溃 内存 最佳 是什么 titanium appcelerator 数据绑定      更新时间:2023-09-26

我一直在使用自定义事件来处理与titanium appcelerator的数据绑定,使用一个名为RefreshComp的事件来处理给定对象id(在所有对象中都是唯一的)和传递新值的属性。这个新值可能来自推送通知,一个在iphone应用程序中编辑的对象,你想传播到所有的comp等等

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元素组成。这提供了一种管理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;
};

创建这样的comp:

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

希望能有所帮助。