объект освобожден без пула - просто подтекает? - PullRequest
0 голосов
/ 30 января 2010

освобождение объекта без пула - просто утечка?
Это утечка памяти?
Как я могу избежать этого?

Ответы [ 3 ]

2 голосов
/ 30 января 2010

Объект не освобождается, он автоматически освобожден . Авто-релиз - это как отложенная очистка, это означает, что «я закончил с этим, не стесняйтесь избавиться от него позже». Иногда другая часть кода, например функция, из которой была вызвана ваша функция, будет захватывать объект ( retain it) до того, как произойдет автоматическое освобождение.

Авторелизинг управляется классом NSAutoreleasePool. Класс поддерживает стек пулов, а когда объект автоматически освобождается, он добавляется в самый верхний пул в стеке. Осушение пула приводит к тому, что он освобождает все объекты, которые были добавлены в него - и если они были освобождены достаточно, они будут освобождены. Вам не нужно управлять экземплярами NSAutoreleasePool напрямую, если вы этого не хотите; Вы можете просто поместить свой код в блок @autoreleasepool{}, и компилятор вставит статический экземпляр NSAutoreleasePool.

Существует три способа удаления этого сообщения. Одна из них, которая работает как на Mac, так и на iPhone, предложена KennyTM - добавьте пул авто-выпусков вокруг вашего кода, который использует автоматически выпущенные объекты. Вам нужен один для каждого потока, где вы автоматически высвобождаете объекты Какао, возможно больше, но обычно достаточно одного. Вторая альтернатива, хотя и только если вы ориентируетесь на Mac OS, - это включить сборку мусора. Это не решит все ваши проблемы, но означает, что объекты, на которые нет ссылок, будут автоматически удалены.

На обеих платформах вы также можете использовать автоматический подсчет ссылок, который дает указание компилятору позаботиться об управлении памятью. Вам все еще нужно установить пулы авто-релиза, и есть некоторые «интересные» взаимодействия с бесплатными мостами, но в целом, если вы боретесь со счетчиком ссылок, вероятно, лучше всего его автоматизировать.

Если вы не знакомы с подсчетом сохранения и пулами автоматического выпуска, у вас могут быть другие проблемы с управлением памятью в вашем коде. Я рекомендую вам использовать статический анализатор в вашем проекте (выберите «Build & Analyze» в меню сборки Xcode) и решать любые возникающие проблемы.

1 голос
/ 30 января 2010

это утечка памяти ???

Да.

если да, как я могу избежать этого ???

Вам нужен NSAutoreleasePool. Например,

int main () {
  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

  ... your main code ...

  [pool drain];
  return 0;
}
0 голосов
/ 05 февраля 2011

Если вы видите, что это сообщение зарегистрировано до вызова вашей основной функции, это потому, что статические инициализаторы создают временные переменные, которые автоматически высвобождаются без пула.

Вот решение (я поставил его чуть выше своей основной функции). AppInitFunc вызывается перед статическими инициализаторами C ++, поэтому пул создается до того, как называются статические инициализаторы.

static NSAutoreleasePool* cplusplus_static_pool = nil;
extern void AppInitFunc(void) __attribute__ ((constructor));
void AppInitFunc(void)
{
    cplusplus_static_pool = [[NSAutoreleasePool alloc] init];
}

extern void AppTermFunc(void) __attribute__ ((destructor));
void AppTermFunc(void)
{
//  draining pool here may cause a crash on termination.
//  [cplusplus_static_pool drain];
}

int main(int argc, char *argv[])
{
    /* release the static init pool, create another */ 
    [cplusplus_static_pool release]; 
    cplusplus_static_pool = [[NSAutoreleasePool alloc] init];
    return NSApplicationMain(argc,  (const char **) argv);
}

/* now you can do this and not leak */    
static const NSArray* kArrayOfStrings = [[NSArray arrayWithObjects:@"1", @"2", nil] retain]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...