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文檔