id
是一个 C 声明。您可以像这样简单地将基于范围的自动释放池添加到您的 cpp 程序中:
自动释放池.hpp
class t_autorelease_pool {
public:
t_autorelease_pool();
~t_autorelease_pool();
private:
id d_pool; // << you may opt to preprocess this out on other platforms.
private:
t_autorelease_pool(const t_autorelease_pool&);
t_autorelease_pool& operator=(const t_autorelease_pool&);
};
自动释放池.mm
t_autorelease_pool::t_autorelease_pool() : d_pool([NSAutoreleasePool new]) {}
t_autorelease_pool::~t_autorelease_pool() { [this->d_pool drain]; }
在 cpp 程序中:
void UpdateUI() {
t_autorelease_pool pool;
// your/their autoreleasing code here
}
另一种选择(可能很容易错误地使用)是直接使用 ObjC 运行时 - 它看起来像以下 C 程序:
#include <objc/runtime.h>
#include <objc/message.h>
...
id pool = objc_msgSend(objc_getClass("NSAutoreleasePool"), sel_getUid("new"));
/* do stuff */
objc_msgSend(pool, sel_getUid("drain"));