簡體   English   中英

在沒有 Objective-C 的情況下使用 Apple 自動釋放池

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM