Как я могу найти поток, который протекает, потому что ему не хватает NSAutoreleasePool? - PullRequest
0 голосов
/ 10 октября 2011

Я получаю это сообщение при запуске приложения:

*** __NSAutoreleaseNoPool(): Object 0xadf5e50 of class __NSDate autoreleased with no pool in place - just leaking

Я понимаю, что мне нужно создать NSAutoreleasePool в начале потока, в котором это происходит, но я неуверен, где в моем коде это происходит.Можно ли установить точку останова, которая будет достигнута при автоматическом освобождении данного объекта?

Ответы [ 3 ]

2 голосов
/ 10 октября 2011

Вы можете установить символическую точку останова на __NSAutoreleaseNoPool и посмотреть, в каком потоке вы находитесь, когда нажимаете на него.Это можно сделать с помощью пользовательского интерфейса в нижней части Xcode Breakpoint Navigator или в командной строке GDB, если вы предпочитаете, введя команду: break __NSAutoreleaseNoPool

1 голос
/ 10 октября 2011

Из CocoaDev в MallocStackLogging :

Это переменная среды.Когда эта переменная среды установлена, например, с помощью «setenv MallocStackLogging 1» в tcsh, вы можете запустить любое приложение в этой оболочке.Не «открывайте» приложение, запускайте его из оболочки.Когда вы делаете это, все malloc отслеживаются.Затем, сказав, что в другой оболочке «утечки» или «утечки» даст вам потенциально обширный список утечек в приложении на данный момент.количество утечек меняется между итерациями.Утечка имеет идентификатор, который остается неизменным в течение всего времени жизни приложения, размера и иногда предположения о типе объекта утечки, и дамп начального бита утечки данных.

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

0 голосов
/ 10 октября 2011

Простое добавление пула автоматического выпуска в основную функцию вашего потока должно решить вашу проблему с управлением памятью. Как это

- (void)main
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    ...
    Your code here
    ...

    [pool release];
}

или если вы хотите использовать новый синтаксис

- (void)main
{
    @autoreleasepool {
        ... your code here ...
    }
}

В любом случае, вы должны проверить все NSDate, созданные фабричным методом или автоматически выпущенные вами. Все фабричные методы для класса NSDate перечислены ниже

  • дата

  • dateWithNaturalLanguageString:

  • dateWithNaturalLanguageString: локаль:

  • dateWithString:

  • dateWithTimeIntervalSinceNow:

  • dateWithTimeInterval: sinceDate:

  • dateWithTimeIntervalSinceReferenceDate:

  • dateWithTimeIntervalSince1970:

(из документация Apple )

...