[英]Using Apple autorelease pools without Objective-C
我正在開發一個需要在 Linux、Windows 和 Mac OS X 上運行的應用程序。為此,我將 C++ 與 Qt 一起使用。
出於多種原因,在 Mac OS X 上,我需要使用 CoreFoundation 函數(例如CFBundleCopyBundleURL
)來創建需要使用CFRelease
發布的核心對象。 但是這樣做會產生很多這樣的警告:
*** __NSAutoreleaseNoPool(): Object 0x224f7e0 of class NSURL autoreleased with no pool in place - just leaking
我看到的所有關於這些自動釋放池的代碼都是用 Objective-C 編寫的。 有人知道如何在 C 或 C++ 中創建/使用自動釋放池嗎?
我看到的所有關於這些自動釋放池的代碼都是用 Objective-C 編寫的。
因為自動釋放池只存在於 Cocoa 和 Cocoa Touch 中。
有人知道如何在 C 或 C++ 中創建/使用自動釋放池嗎?
唯一的方法是將 Cocoa 代碼(池的創建和排放)包裝在一對 C 函數中。 即便如此,這是一個丑陋的黑客攻擊,只是掩蓋了一個更深層次的問題。
你真正應該做的是准確地找出什么是自動釋放對象(儀器將幫助你做到這一點)並修復它或切除它。
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"));
您得到的錯誤是由某處使用便利靜態方法 [NSURL urlWithString:] 創建一個 Objective-C 類 (NSURL) 引起的。 返回非“分配”或“復制”對象的方法應在返回對象之前將對象放入自動釋放池中。 而且由於您還沒有設置它,它只會崩潰或泄漏內存。
我不確定如何解決此問題,但您需要輸入以下內容:
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
doStuff();
[pool release];
在您的代碼中的某處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.