appcelerator中数据绑定的最佳实践是什么,避免内存崩溃

时间:2012-01-16 04:42:07

标签: javascript ios data-binding titanium appcelerator

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

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但是没有这个例子。

1 个答案:

答案 0 :(得分:0)

有数百万种刷新特殊组件的方法。我通常倾向于拥有一个干净简单的结构,其中每个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;
};

像这样创建你的comp:

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

希望它有所帮助。