Точка останова, указывающая "objc_autoreleaseNoPool" - программирование
Подтвердить что ты не робот

Точка останова, указывающая "objc_autoreleaseNoPool"

Итак, я отлаживаю приложение в preperation для своего приложения, поэтому отпустите его, и я включил универсальную точку останова для "All Exceptions". С тех пор, каждый раз, когда я запускаю приложение, консоль печатает:

Catchpoint 2 (throw) В ожидании точки останова 1 - "objc_exception_throw" разрешен

objc [11765]: объект 0x8f18ff0 класса __NSCFLocale автореализован без пула на месте - просто утечка - разрыв на objc_autoreleaseNoPool() для отладки

objc [11765]: Объект 0x8f190a0 класса __NSCFNumber автореализован без пула на месте - просто утечка - разрыв на objc_autoreleaseNoPool() для отладки

objc [11765]: объект 0x8f1fef0 класса __NSCFLocale автореализован без пула на месте - просто утечка - разрыв на objc_autoreleaseNoPool() для отладки

Буквально печатается 3 раза. Я понятия не имею, что это значит, но выглядит плохо. Любые советы будут оценены.

4b9b3361

Ответ 1

Новая информация

Я определил, где моя проблема, создавая swizzled метод autorelease.

Я не рекомендую это делать, если вы не знаете, что делаете, но это то, что я узнал.

+ (void) load; //Method is called outside the original autorelease pool.
+ (void) initialize; // Method is called outside the original autorelease pool.

NSThread создает собственный поток, вызываемый метод должен быть обернут в пул автозапуска.

Grand Central Dispatch заботится о том, чтобы адаптироваться к пулу автозапуска при использовании команд "dispatch _...". однако, если вы отправляете вручную. вы можете обернуть его в пул автозапуска.

Кроме того, ARC не справляется, давая вам знать, что аутроверсия произойдет за пределами пула.

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

используйте это.

[[NSString alloc] initWithFormat:@"%@",myObject];

вместо этого

[NSString stringWithFormat:@"%@",myObject];

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

Надеюсь, что это поможет.

Оригинальный ответ

Хорошо, я не думаю, что на этот вопрос был дан достаточно подробно.

представленное сообщение было

objc[1310]: Object 0x34f720 of class SimpleKeychain autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug

Отладчик указывает на возможную точку останова, которая поможет вам отладить ситуацию. Теперь, когда этот контрольный пункт действительно мало помог отладить ситуацию. Я думаю, что важно знать, как добавить эту точку останова в отладчик, и поэтому я потратил время на то, чтобы поработать с ней (после очистки Интернета и поиска ничего), пока я не получил его, чтобы сломать эту ошибку.

Довольно неприятно, что разрыв во всех ошибках не поймает этого, но вот шаги для добавления точки останова в отладчик.

Первое, что вы хотите сделать, это выбрать навигатор останова отладки

navigator toolbar

нажав на эту вкладку

breakpoint button

затем вы посмотрите в нижнюю часть панели навигатора и нажмите кнопку "Плюс"

Add Exception Breakpoint

Это позволит вам вручную добавить точку останова.

Я выбрал точку останова С++ и ввел имя сообщения в текстовое поле имени.

Adding custom C++ exception

после добавления этого исключения он действительно нарушил.

Однако это может быть или не быть полезным для вас как объектного разработчика c. Это ворвалось в код Ассамблеи.

assembly code at achieved breakpoint.

К сожалению, он только показал эту точку в стеке вызовов для потока.

Thread list

И оказалось, что проблема автоопределения состояла в том, что класс, называемый autorelease в вызове dispatch_once. и дальнейшее исследование показало, что + (пустая) нагрузка; метод в классе назывался раньше всего. это выполняется через функцию call_load_methods и находится вне потока основного метода.

Error Call and Stack

чтобы исправить это, я просто добавил обертку пула автозаполнения вокруг вызова.

updated error call

другим решением может быть добавление пула автозаполнения в нагрузке + (void); метод. но этого было достаточно для моих целей.

ПРИМЕЧАНИЕ. Я добавляю это к сообщению здесь, потому что мне не нравится находить проблему и не в состоянии определить все пути к полученному ответу. Если отладчик говорит вам добавить точку останова в указанную функцию, тогда для получения этой информации должна быть какая-то информация. Надеюсь, это снизит разочарование некоторых из тех, кто пытается найти этот ответ.

Ответ 2

Многие из методов в cocoa api возвращают автореализованные объекты. В частности, те методы, которые возвращают объект, который не начинается с init, например [NSNumber numberWithLong:]. Если у вас нет пула авторезистов, эти объекты будут просочиться. Вы можете найти дополнительную информацию об использовании NSAutoreleasePool в documentation.

Ответ 3

Это означает, что вам нужно создать пул автозаполнения в потоке, который он имеет. В противном случае ваши выделенные объекты не будут уничтожены (как указано в сообщении). Итак, перерыв/пауза в символе, затем поднимите стек к записи потока (или программы) и добавьте пул авторезистов. Это все.