Утечка авто-релиза iPhone-c - PullRequest
2 голосов
/ 31 марта 2010

Я делаю это:

NSString *fullpath = [[NSBundle mainBundle] pathForResource:@"text_file" ofType:@"txt"];

Почему появляется следующее сообщение? Мой код течет?

2010-03-31 13:44:18.649 MJIPhone[2175:207] *** _NSAutoreleaseNoPool(): Object 0x3909ba0 of class NSPathStore2 autoreleased with no pool in place - just leaking
Stack: (0x1656bf 0xc80d0 0xcf2ad 0xcee0e 0xd3327 0x2482 0x2426)
2010-03-31 13:44:18.653 MJIPhone[2175:207] *** _NSAutoreleaseNoPool(): Object 0x390b0b0 of class NSPathStore2 autoreleased with no pool in place - just leaking
Stack: (0x1656bf 0xc80d0 0xc7159 0xd0c6f 0xd3421 0x2482 0x2426)
2010-03-31 13:44:18.672 MJIPhone[2175:207] *** _NSAutoreleaseNoPool(): Object 0x390d140 of class NSCFString autoreleased with no pool in place - just leaking
Stack: (0x1656bf 0xc6e62 0xcec1b 0xd4386 0x24ac 0x2426)

Ответы [ 2 ]

2 голосов
/ 31 марта 2010

Это происходит потому, что вы работаете в потоке. Пользовательские потоки не разделяют пул автоматического выпуска основных потоков, поэтому вам нужно создать свой собственный. В противном случае подобные объекты никогда не будут освобождены, что приведет к утечке.

В начале вашего метода потока, перед циклом или чем-то еще, выполните:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

Перед возвращением отпустите:

* +1007 *
1 голос
/ 31 марта 2010

В то время, когда вы запускаете эту строку кода, в текущем потоке не было создано NSAutoreleasePool.

Если вы работаете в главном потоке, Cocoa (и Cocoa Touch) автоматически предоставит вам пул автоматического выпуска. Если вы запланировали что-то, что должно произойти в отдельном потоке (который также будет включать в себя что-то, запланированное на performSelectorInBackground:withObject:), то вам нужно предоставить свой собственный пул автоматического выпуска.

...