Shisheng Chen
Shisheng Chen
zig的`DebugAllocator`内存分配器(以前叫GeneralPurposeAllocator)支持内存泄露检测,并且支持泄露产生位置的堆栈回溯。这个特性对于C的内存管理来说,绝对是神器。于是捣鼓了下让awtk使用zig的内存分配器: 首先在`awtk/src/mem.c`文件添加用于设置外部内存分配器的接口如下: ```C ret_t mem_set_allocator(mem_allocator_t* allocator) { return_value_if_fail(allocator != NULL, RET_BAD_PARAMS); s_allocator = allocator; return RET_OK; } ``` 然后在zig源码上实现`mem_allocator`,见这里:https://gitee.com/ufbycd/awtk-mvvm-zig-example/blob/dev/src/awtk.zig#L118 然后运行awtk-mvvm-zig-example程序,程序退出后分配器打印了大量内存泄露信息,泄露位置集中在`fscript_parser`和AWTK-MVVM的`data_binding`。我分析了一两个位置,确实是内存泄露了,比如这个: ``` error(gpa): memory address 0x7ecfd3f41780 leaked: /home/chenss/workspace/zlgopen/awtk-mvvm-zig-example/src/awtk.zig:148:43: 0x12ce088 in alloc...
tab_button以前是以垂直方向排列图标和text,这符合大多数应用情况。然而现在变成水平排列的,与常规应用要求不符,且不能指定排列方式。 看看老式demo下都变成啥样了: 
研究了几天,确实可以实现通过zig的泛型/反射特性,直接用Model在编译时构造出View-Model:https://gitee.com/ufbycd/awtk-mvvm-zig-example 实现过程中遇到的问题: * zig直接调用C时暂不支持包含位域的API,后续AWTK地否考虑去除几个重要的头文件内的位域以方便zig调用?主要为这几个头文件:`base/widget.h`、`tkc/object.h`和`tkc/value.h`(目前已经手动适配了位域而无需修改AWTK源码,但整体来说还是有点不便的,建议不要用位域,内存对齐跑起来才快) * ~~`awtk_main.inc`这种形式不方便zig调用,且zig要求main函数必须要在zig源码内,故`awtk_main.inc`文件不能直接使用,需要在zig内重新实现~~(还是由zig实现main函数好点,使用zig的defer延迟调用实现起来要好看很多;且在初始化代码内接收动态构建参数也很容易实现) * ~~View-Model中setProp的属性类型如果是字符串的话,容易出现内存管理错误~~ (已解决,是我的问题,是字符串在zig和c之间转换不正确导致)