在对PurgeableMemory对象进行读写访问时,需要注意哪些事项(结合接口说明和示例代码说明)?

阅读 574
1 个回答

在对PurgeableMemory对象进行读写访问时,需要注意以下事项:

  1. 读访问注意事项

    • 开始读操作前检查:在进行读访问之前,需要调用OH_PurgeableMemory_BeginRead接口检查是否可以进行读操作。如示例中if(OH_PurgeableMemory_BeginRead(pPurgmem)),如果该接口返回true,表示可以进行读操作;如果返回false,则可能表示对象当前状态不允许读操作,可能是正在被其他操作占用或者已经被释放等情况。
    • 正确获取和处理数据:在成功开始读操作后,可以通过OH_PurgeableMemory_GetContent获取PurgeableMemory对象的内容,如ReqObj* pReqObj = (ReqObj*) OH_PurgeableMemory_GetContent(pPurgmem);,这里将获取到的内容转换为合适的类型(示例中为ReqObj类型)进行处理。同时,通过OH_PurgeableMemory_ContentSize获取对象内存数据大小,以便正确处理数据范围。
    • 结束读操作:读取完成后,必须调用OH_PurgeableMemory_EndRead接口结束读操作,如OH_PurgeableMemory_EndRead(pPurgmem);。这会将PurgeableMemory对象的引用计数减1,当引用计数为0时,该对象可以被系统回收,释放内存资源。如果不及时结束读操作,可能会导致内存资源无法及时释放,造成内存浪费。
  2. 写访问注意事项

    • 开始写操作前检查:与读操作类似,写操作前需要调用OH_PurgeableMemory_BeginWrite接口检查是否可以进行写操作,如if(OH_PurgeableMemory_BeginWrite(pPurgmem))
    • 获取和修改数据:在成功开始写操作后,通过OH_PurgeableMemory_GetContent获取对象数据,然后进行修改操作。在示例中,先获取数据ReqObj* pReqObj = (ReqObj*) OH_PurgeableMemory_GetContent(pPurgmem);,然后声明扩展创建函数的参数(struct AppendParaData apdata = {1};),并调用OH_PurgeableMemory_AppendModify更新PurgeableMemory对象重建规则,这里传入了修改函数AddFunc和参数&apdata来对数据进行修改(在AddFunc函数中对数据进行了加法操作)。
    • 结束写操作:写操作完成后,要调用OH_PurgeableMemory_EndWrite接口结束写操作,如OH_PurgeableMemory_EndWrite(pPurgmem);。这同样会调整引用计数,确保内存资源在合适的时候被回收。如果不结束写操作,可能会导致对象一直处于被占用状态,影响内存管理和其他操作对该对象的访问。

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进