Table of Contents

API 惯例

在使用 EasyAR Sense 的 API 时,需要遵循一些惯例,否则可能会引起程序崩溃、出现内存泄漏或其他运行不正常的情况。

支持的语言

EasyAR Sense 支持如下语言:

  • C

    支持 C99 和 Visual C++、gcc、clang

  • C++

    支持 C++17 和 Visual C++、gcc、clang

    用到的 C++17 特性只有 std::optional,如果需要在 C++11 环境使用,可以使用 optional lite,将接口头文件中的 std::optional 替换为 nonstd::optional,并将 #include <optional> 替换为#include "nonstd/optional.hpp"

  • Java

    仅支持 Android 平台,支持 Java SE 6 及以上

  • Kotlin

    仅支持 Android 平台

  • Objective-C

    仅支持 iOS/macOS/visionOS 平台

  • Swift

    支持 Swift 4.2 及以上

  • C#

    支持 .Net Framework 3.5 及以上、.Net Core、.Net 5+、Mono、Unity/Mono、Unity/IL2CPP

线程安全模型

每个类,如果不加说明,则其静态成员是线程安全的。

每个类,如果不加说明,则其实例成员在外部加锁的情况下是线程安全的,在不加锁的情况下不是线程安全的。

每个类,如果不加说明,则在结束对对象的其他调用后,可以从任意线程调用其析构函数,此时是线程安全的。

内存模型

EasyAR Sense 内部使用 C++ 的 std::shared_ptr 进行引用计数,而引用计数和垃圾回收之间存在着根本上的不兼容,不能无缝转换。

  • C, C#, Java/Kotlin

    需要进行手动引用计数,使用 dispose 释放持有的对象的引用,使用 clone 从一个引用创建一个新的引用。

    特别需要注意的是传入到 EasyAR Sense 的回调的参数会在回调结束后自动释放,如果需要保留必须进行 clone,自动释放的原因是为了支持传入没有任何逻辑的回调。

    需要注意的是传入到 EasyAR Sense 的回调中如果使用到 EasyAR Sense 的对象可能导致循环引用,需要当成资源(例如文件、操作系统句柄)进行手动释放,防止内存泄漏。

  • C++, Objective-C, Swift

    使用语言内置的引用计数。

    需要注意的是传入到 EasyAR Sense 的回调中如果使用到 EasyAR Sense 的对象可能导致循环引用,应合理使用引用捕捉、std::weak_ptr 等。

字符串编码

接口中使用的字符串的编码如下:

  • C, C++

    UTF-8

  • Java, Kotlin, Objective-C, C#

    UTF-16

  • Swift

    UTF-16 或者 UTF-8, 参考 Swift文档