Как избежать утечки в приложении iPhone? - PullRequest
1 голос
/ 21 июля 2011

я получаю журнал аварий:

2011-07-21 23:18:51.233 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5fbdef0 of class NSURL autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.233 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x1462e38 of class NSCFString autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.233 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x1462e38 of class NSCFString autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.233 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5fb32b0 of class NSCFString autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.235 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5fc04e0 of class NSCFString autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.235 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5f98960 of class NSCFString autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.235 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5fa9c70 of class NSCFString autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.550 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5fbfbb0 of class NSHTTPURLResponse autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.550 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5fb5840 of class __NSCFData autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.550 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5fb1400 of class __NSArrayM autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.551 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5f83e70 of class NSCFString autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.551 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5fbd480 of class NSCFString autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.551 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5fb31b0 of class NSPathStore2 autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.551 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5fa9aa0 of class NSPathStore2 autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.551 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5fa6110 of class __NSArrayI autoreleased with no pool in place - just leaking
2011-07-21 23:18:51.552 iFeel[87679:910b] *** __NSAutoreleaseNoPool(): Object 0x5fb9700 of class NSCFString autoreleased with no pool in place - just leaking

Может ли какое-нибудь тело помочь мне избежать падения?

Ответы [ 3 ]

3 голосов
/ 21 июля 2011

Скорее всего, вы видите это, потому что вы выполняете код в потоке без пула автоматического выпуска. Пул автоматического выпуска активно используется всеми API-интерфейсами Apple, поэтому важно обернуть его вокруг всего потока. Пример этого может быть следующим:

- (void)myThreadMethod:(id)anObject {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSLog(@"This is some objective-c code...");
    [pool drain];
}

Часть [утечка из бассейна] очень важна. Без этого фрагмента кода все объекты, которые были автоматически освобождены при жизни ваших потоков, будут утечки.

1 голос
/ 07 августа 2014

Из документации Apple ссылка :

Класс NSAutoreleasePool используется для поддержки системы управления памятью Cocoa с подсчетом ссылок.В пуле автоматического выпуска хранятся объекты, которым при извлечении самого пула отправляется сообщение об освобождении.

Внимание! Если вы используете автоматический подсчет ссылок (ARC), вы не можете использовать пулы автоматического выпуска напрямую.Вместо этого вы используете блоки @autoreleasepool.Например, вместо:

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
// Code benefitting from a local autorelease pool. 
[pool release];

вы бы написали:

 @autoreleasepool {
     // Code benefitting from a local autorelease pool. 
}

@ блоки autoreleasepool более эффективны, чем непосредственное использование экземпляра NSAutoreleasePool;Вы также можете использовать их, даже если вы не используете ARC.

1 голос
/ 21 июля 2011

Настройка экземпляра NSAutoreleasePool. Проверьте NSAutoreleasePool Class Reference для деталей и примеров.

Вы также можете просмотреть Руководство по программированию управления памятью , чтобы понять, почему важно настроить это и что на самом деле делает autorelease.

Мне также показались полезными обсуждения этого поста: Как работает пул автоматического выпуска NSAutoreleasePool?

...