Ответ 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
Отладчик указывает на возможную точку останова, которая поможет вам отладить ситуацию. Теперь, когда этот контрольный пункт действительно мало помог отладить ситуацию. Я думаю, что важно знать, как добавить эту точку останова в отладчик, и поэтому я потратил время на то, чтобы поработать с ней (после очистки Интернета и поиска ничего), пока я не получил его, чтобы сломать эту ошибку.
Довольно неприятно, что разрыв во всех ошибках не поймает этого, но вот шаги для добавления точки останова в отладчик.
Первое, что вы хотите сделать, это выбрать навигатор останова отладки
нажав на эту вкладку
затем вы посмотрите в нижнюю часть панели навигатора и нажмите кнопку "Плюс"
Это позволит вам вручную добавить точку останова.
Я выбрал точку останова С++ и ввел имя сообщения в текстовое поле имени.
после добавления этого исключения он действительно нарушил.
Однако это может быть или не быть полезным для вас как объектного разработчика c. Это ворвалось в код Ассамблеи.
К сожалению, он только показал эту точку в стеке вызовов для потока.
И оказалось, что проблема автоопределения состояла в том, что класс, называемый autorelease в вызове dispatch_once. и дальнейшее исследование показало, что + (пустая) нагрузка; метод в классе назывался раньше всего. это выполняется через функцию call_load_methods и находится вне потока основного метода.
чтобы исправить это, я просто добавил обертку пула автозаполнения вокруг вызова.
другим решением может быть добавление пула автозаполнения в нагрузке + (void); метод. но этого было достаточно для моих целей.
ПРИМЕЧАНИЕ. Я добавляю это к сообщению здесь, потому что мне не нравится находить проблему и не в состоянии определить все пути к полученному ответу. Если отладчик говорит вам добавить точку останова в указанную функцию, тогда для получения этой информации должна быть какая-то информация. Надеюсь, это снизит разочарование некоторых из тех, кто пытается найти этот ответ.