Чи можна налагодити “Припинено через помилку пам’яті”?


79

У певний (послідовний) момент, коли працює моя програма, я постійно отримую повідомлення про помилку xcode

Припинено через помилку пам’яті.

Я не можу знайти код, що викликає помилку, але можу визначити, який код знаходиться поруч з помилкою (за допомогою точок зупинки).

Помилка виникла безпосередньо після повернення певної комірки в моїй реалізації

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

UITableViewDataSourceметод делегатів. Я можу підтвердити, що він повертає дійсний UITableViewCell, але я думаю, що пояснення та розміщення всього цього методу буде марною тратою вашого часу. Однак я підозрюю, що це може бути спричинено швидким, масовим розподілом пам'яті.

Це точно говорить Terminated due to memory error, а не тиск на пам’ять.

Я хотів би знати, що насправді означає повідомлення. Крім того, чи є спосіб налагодити це повідомлення? Звіт про аварійне завершення роботи не створюється.

Я використовую ARC та iOS 7.


1
Я побачив ту ж помилку в Xcode. Мій додаток аварійно завершував роботу, оскільки я створював надвисокий UIWebView (більше 20000 пікселів). Я ніколи не міг знайти звіт про аварійне завершення роботи, ані знайти спосіб отримання попереджень про пам’ять перед збоєм.
Heath Borders

@HeathBorders Я також використовую UIWebview. Це дуже цікаво. Мені доведеться перевірити висоту на своїй. Дякую!
Санта Клаус

Це свого роду типова помилка з цими компонентами. Можливі причини: якимось чином ви генеруєте занадто багато комірок (перевірте свої розрахунки), розміри ваших комірок неправильні (як при діленні на 0, генеруючи нан, який є нескінченним числом, коли визначаєте розмір). або виникають на нескінченній петлі.
Почі

@HeathBorders Тепер мені цікаво дізнатись, на якому пристрої ви тестували?
Санта Клаус

Я тестував на iPad3. Крім того, мій UIWebViewбув не просто надвисоким, він також був надшироким (30000px).
Heath Borders

Відповіді:


56

Я отримував цю помилку і не міг зрозуміти, що сталося.

Після деяких пошуків я виявив, що забув відключити зомбі.

Щоб вимкнути, зробіть наступне:

Виберіть схему редагування

Скасуйте вибір "Увімкнути об'єкти зомбі


5
Коли активовано зомбі, це впливає, оскільки об’єкти не звільняються. Це дуже швидко заповнює пам’ять у випадку перегляду таблиці, де виділяється та звільняється багато речей. Визначення Enable Zombies: Замініть вивільнені об'єкти на "зомбі" об'єкт, який фіксує будь-яку спробу його використання. Коли ви надсилаєте повідомлення зомбі-об'єкту, час виконання реєструє помилку та аварійно завершує роботу. Ви можете подивитися на зворотну трасування, щоб побачити ланцюжок дзвінків, що спричинили детектор зомбі.
zirinisp

2
І все-таки я стикаюся з проблемою. Будь ласка, скеруй мене.
Я навчаюсь

Як вимкнути зомбі?
Сем

12

Я зіткнувся з тією ж проблемою . ("Припинено через помилку в пам'яті") Я спробував усі вищезазначені відповіді, але нічого для мене не працює. Потім я налагоджую свій код і виявляю, що цикл for працює нескінченно, виділяючи пам'ять у масив зі значенням nil кожного разу. Він використовує 300 + МБ, щоб це дало цю помилку

Дякую.


U врятував мій час. Дякую.
Saikiran K 02.03.17

7

У мене було точно таке ж питання. Я думав, що це спричинило витік пам’яті в моїй програмі або використання занадто великої кількості пам’яті. Я користуюся інструментами, і розподіляючий профіль і програма добре працюють. Також я запускав програму за пристроєм досить довго, і вона також прекрасно працює.

Я також використовую iPad 3-го покоління для налагодження, це може бути причиною через таку повільність пристрою чи помилку, здається, просто Xcode і працює від проблеми Xcode. Не проблема витоку або виділення пам'яті.

Якщо ви переконаєтесь, що інструменти та запущений додаток на самому пристрої працюють


Мда. Усі, хто брав участь у цій публікації, тестували iPad третього покоління. Випадковість?
Санта Клаус

Я використовую лише iPad третього покоління, тому я ще не впевнений. Сьогодні я замовив iPad mini retina, тож я можу відповісти на це наступного тижня;)
Tomohisa Takaoka

Щойно зіткнувся з цим на iPhone5S. Просто додав код відстеження Google і довелося зменшити з arm64 до arm7 / 7s, як Google's slooooww при створенні arm64. Я припускав, що це річ arm64 / 7s. Звичайно, це не просто випуск iPad третього покоління. У мене сталася "помилка в __connection_block_invoke_2", яка за окремими пошуковими запитами говорить мені, що це може бути пов’язано із занадто великим завантаженням та OOMing. Однак соромно за відсутність стека ...
Пітер,

Я стикаюся з цим на iPad mini 2-го покоління ( iPad4,4 ).
Сліпп Д. Томпсон

3
У мене схожа проблема при завантаженні цілої групи зображень за допомогою NSURLSession. Симулятор та автономний пристрій (iPhone 6) чудово працює. В інструментах схема розподілу також виглядає гладко. Не розбивайся теж. Проблема виникає, коли пристрій підключено до xCode. Незалежно від конфігурації збірки (налагодження або випуск). Завжди закінчується загадкою "Помилка пам'яті".
Неру

6

Я використовував Tesseract для розпізнавання тексту, і коли мій цільовий текст був відсканований, повинен був відтворитися GIF. Коли GIF почав відтворюватися, спостерігався сплеск пам’яті - від 70-80 МБ до 450 МБ. Проблема полягала в тому, що GIF забирав занадто багато пам’яті, програма аварійно працювала, а Xcode показував це повідомлення. Тож я видалив відповідний imageView із нагляду ViewController.

imageView.removeFromSuperview

Після цього програма все одно зросте до 450 Мб, але потім негайно випустить і зменшиться до 40 Мб


1
Я витратив 2 дні, щоб виправити збій пам'яті, ваше рішення допомогло. Дякую..!
Aleesha

4

Пристрій перезапуску спрацював у мене. Повідомлення "Припинено через помилку пам'яті" припинило з'являтися.


2

Відредагуйте схему, у розділі Діагностика ви знайдете кілька варіантів захисту розподілу. Для отримання детальної інформації зверніться до документації .

Питання: чи справді там написано "припинено через помилку пам'яті", а не "тиск"? Перевірте інструменти, якщо у вашої програми недостатньо пам’яті, якщо у програми, здається, мало пам’яті, то на цьому вам слід зосередитися, незалежно від того, яке саме повідомлення.


1
Тут однозначно сказано "помилка", а не "тиск". Рівень пам’яті на момент збою стабільно становить приблизно 15 МБ.
Санта Клаус

Потім спробуйте з увімкненою діагностикою malloc. До речі, ви тестуєте на пристрої?
LearnCocos2D

0

З Xcode 11 він запустив мій проект у Debugрежимі. Я роблю запис / редагування зображень / повернення користувачеві, і це не те, що ти можеш використовувати Debug. Як тільки я перейшов у Releaseрежим, все пройшло добре.


0

З такою проблемою я стикався через неуважність.

Я викликав функцію, яка додає imageView як підвигляд у:

override func layoutSubviews() {
    super.layoutSubviews()
}

Це спричинило величезне використання пам'яті, тож будьте уважні до такого роду речей!


0

У мене була подібна проблема в Xcode 11.3, коли камера дзвонила щоразу, коли ми натискаємо кнопку повторити спробу. Якщо це робиться кілька разів, то трапляється збій.

Це було виправлено, коли ми вимкнули зомбі-об’єкти. Нижче наведені кроки:

  1. Натисніть на назву проекту, присутню у верхньому лівому куті. Це покаже список цілей, присутніх у проекті.
  2. Натисніть Редагувати схему

Знімок екрана-1

  1. Виберіть параметр "Виконати" -> "Діагностика" -> Зніміть прапорець біля "Зомбі"

Знімок екрана-2

Тепер запустіть свій проект. Це повинно працювати нормально.


0

Річ, яку я помітив, полягає в тому, що коли я запускаю свою програму на пристрої за допомогою кабелю і залишаю її простою довгий час, я також отримаю цю помилку.

Apple справді вирішує цю проблему, і, можливо, здається, що програма простоює і просто вбиває її.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.