Использование пулов автоматического выпуска Apple без Objective-C - PullRequest
3 голосов
/ 01 апреля 2010

Я занимаюсь разработкой приложения, которое должно работать в 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 ++?

Ответы [ 4 ]

2 голосов
/ 04 ноября 2010
1 голос
/ 11 ноября 2011

id является декларацией C. Вы можете просто добавить пулы автоматического освобождения на основе области действия в свою программу cpp следующим образом:

autorelease_pool.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&);
};

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"));
1 голос
/ 01 апреля 2010

Весь код, который я видел относительно этих пулов автоматического выпуска, написан на Objective-C.

Поскольку пулы автоиздания существуют только в Cocoa и Cocoa Touch.

Кто-нибудь знает, как создавать / использовать пулы автоматического выпуска в C или C ++?

Единственный способ сделать это - обернуть код Какао (создание и удаление пула) в пару функций Си. Даже тогда это уродливый хак, который просто маскирует более глубокую проблему.

Что вам действительно нужно сделать, так это выяснить, что именно представляет собой автоматическое освобождение объектов (инструменты помогут вам в этом), и либо исправить это, либо вырезать.

0 голосов
/ 21 октября 2010

Ошибка, которую вы получаете, вызвана тем, что где-то создается класс Objective-C (NSURL) с использованием удобного статического метода [NSURL urlWithString:]. Методы, которые возвращают объекты, которые не являются «alloc» или «copy», должны помещать объект в пул автоматического выпуска перед возвратом объекта. А поскольку вы не настроили его, он просто потерпит крах или утечку памяти.

Я не уверен, как именно это исправить, но вам нужно поставить что-то вроде:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
doStuff();
[pool release];

где-то в вашем коде.

...