#iphone #objective-c #cocoa-touch #memory #memory-management
#iPhone #objective-c #cocoa-touch #память #управление памятью
Вопрос:
У меня есть приложение для iPhone, которое выходит из строя без объяснения причин. Прочитав, что пулы автоматического выпуска не рекомендуется использовать для iOS, я пошел искать их в своем приложении и обнаружил три (включая один в main.m и один в NSThread).
Что именно мне нужно сделать, чтобы исключить их из моего кода?
Спасибо!
РЕДАКТИРОВАТЬ 1
Я печатаю, но не могу понять, почему происходит сбой. По сути, я запускаю поток, который вызывает метод, а затем приложение выходит из строя. Первое, на что настроен метод, это печатать на консоль (без значений, просто чтобы показать, что вызов сработал), но он даже не доходит до этой точки. Очень странно. Есть идеи о том, как я мог бы это отладить?
Комментарии:
1. Пулы автоматического выпуска — не ваша проблема. Они вам действительно нужны.
2. Требуются пулы автоматического выпуска. Проверьте, запускаете ли вы задачу в другом потоке. Скорее всего, вам понадобится пул автоматического выпуска, в зависимости от того, что вы делаете.
3. вы нашли их в своем code-приложении? и кто их вставил?
Ответ №1:
Где вы прочитали, что пулы автоматического выпуска не рекомендуется? Я предлагаю вам найти несколько лучших источников информации.
Конечно, вы не должны использовать пулы автоматического выпуска бессистемно, и неправильное использование может вызвать проблемы, но определенные ситуации требуют этого. Как минимум, там должен быть тот, который вы нашли в main.m
. Как и тот, который вы нашли в своем NSThread
. Очень маловероятно, что они ответственны за ваш сбой, предполагая, что ваш код использует их правильно.
При сбое вашего приложения вы получаете что-нибудь вообще при запуске в режиме отладки? Есть ли трассировка стека в консоли или сообщения журнала, в которых говорится о предупреждениях о памяти? Происходит ли сбой приложения случайным образом или только после выполнения определенного действия? Было бы полезно получить больше информации и / или кода.
Комментарии:
1. Отладчик ничего не печатает. Просто «программа завершена со значением статуса 1». Смотрите РЕДАКТИРОВАНИЕ 1. 🙂
2. @Eric Brotto — Похоже, на данный момент ваш код довольно мал. Если да, то опубликуйте часть кода, чтобы дать нам лучшее представление о том, что вы пытаетесь сделать, и как вы пытаетесь это сделать?
Ответ №2:
Авторелизы, которые являются частью шаблонов iOS, не являются проблемой. Часто необходимы пулы автоматического выпуска, и они могут быть не причиной сбоя вашего приложения.
Для решения вашей проблемы
- Добавьте инструкции NSLog в свой код, чтобы попытаться выяснить, где происходит сбой вашего приложения
- Используйте инструменты для обнаружения проблем с памятью и утечек
- Возможно, вы перестарались с освобождением объектов. Вот отличное руководство по управлению памятью.
Ответ №3:
Автозапуск в основной функции и в новом потоке требуется в соответствии с документацией Apple. потому что при запуске приложения для запуска приложения резервируется некоторая память. и если пул автозапуска удален из основной функции, утечка памяти будет показана симулятором таким же образом при создании нового потока.
Ответ №4:
Требуются пулы автоматического выпуска, и наличие пула автоматического выпуска, безусловно, не ваша проблема. Если ваше приложение выходит из строя без полезного журнала, попробуйте установить точку останова для исключений.