簡體   English   中英

如何在沒有Objective-C的情況下創建NSAutoreleasePool?

[英]How to create a NSAutoreleasePool without Objective-C?

我有用C ++編寫的多平台游戲。 在mac版本中,即使我沒有任何obj-c代碼,我使用的其中一個庫似乎是自動釋放的東西,我得到內存泄漏,因為我沒有創建NSAutoreleasePool。

我想要的是能夠在不使用obj-c代碼的情況下創建(並銷毀)NSAutoreleasePool,因此我不需要創建.m文件,只需更改我的構建腳本。 那可能嗎? 怎么辦?

OBS:Tagged C和C ++,因為任何一種語言的解決方案都可以。

你不能避免實例化Objective-C運行時 - 但顯然你已經有了其中之一。

如果要從C與運行時進行交互,可以使用Objective-C運行時API,如Objective-C運行時編程指南Objective-C運行時參考中所述

這個想法是這樣的(未經測試):

#include <objc/runtime.h>
#include <objc/objc-runtime.h>
id allocAndInitAutoreleasePool() {
  Class NSAutoreleasePoolClass = objc_getClass("NSAutoreleasePool");
  id pool = class_createInstance(NSAutoreleasePoolClass, 0);
  return objc_msgSend(pool, "init");
}
void drainAutoreleasePool(id pool) {
  (void)objc_msgSend(pool, "drain");
}

如果你想從另一個文件調用這些函數,當然你也必須在那里包含objc / runtime.h。 或者,或者,您可以在allocAndInit函數的返回中將id轉換為void *,並取消void *並在drain函數中強制轉換為id。 (您也可以轉發聲明struct objc_object和typedef struct objc_object * id,但我相信實際上並不能保證它是正確的定義。)

您不必在link命令中傳遞-lobjc。

毋庸置疑,讓構建腳本處理.m文件可能不那么重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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