#iphone #ios #ipad #instruments #memory-leaks
#iPhone #iOS #iPad #инструменты #утечки памяти
Вопрос:
Я вижу много утечек в нескольких объектах UIPasteboard. До сегодняшнего дня я никогда не слышал об этом классе и (очевидно) сам не использовал его в программе. Вот скриншот:
Что я могу сделать, чтобы избавиться от этих утечек? Правильно ли я вообще смотрю на эту проблему?
Комментарии:
1. Я не уверен, как это сделать самому, но я считаю, что есть такое руководство, которое поможет в этом. Это то, что вы ищете? raywenderlich.com/2696 /…
2. Первое, что вы можете сделать, это вставить код, который вы используете в отношении вставок, чтобы мы могли посмотреть, как он может протекать.
3. @Zigglzworth: Как я уже упоминал в вопросе, я не использовал шаблоны в коде, поэтому я действительно не знаю, что сюда вставить.
4. Что-то в вашем коде должно использовать uipasteboards. Используете ли вы какой-либо сторонний код?
5. @Zigglzworth: Вы совершенно правы! Я использовал пакет OpenUDID, и он протекает. github.com/ylechelle/OpenUDID/blob/master/OpenUDID.m Вот где находится код. Вы хотите, чтобы я принял ваш другой ответ?
Ответ №1:
обязательно проверьте, не является ли проблема экземпляром UIPasteboard в любом используемом стороннем коде.
Комментарии:
1. У меня была строка утечек объектов в классе UIPasteboard внутри библиотеки OpenUDID. Надеюсь, это будет исправлено!
Ответ №2:
Без трассировки стека вы не сможете многое сделать.
UIPasteboard используется для реализации копирования и вставки. На рабочем столе он также используется для перетаскивания. Помимо этих двух задач, я не совсем уверен, для чего еще люди обычно используют его, но это способ отправки фрагментов данных между приложениями (при условии, что оба приложения знают, что нужно смотреть на картонную доску).
Комментарии:
1. Мой код не выполняет никаких действий по копированию / вставке. Есть еще идеи?
2. @Ravi: Выясните, почему вы не получаете трассировку стека в инструментах. Возможно, вам потребуется включить ведение журнала стека malloc.
3. Я обновил изображение, чтобы отразить трассировку стека. Есть мысли? Теперь я почти уверен, что это из OpenUDID. Вот код: github.com/ylechelle/OpenUDID/blob/master/OpenUDID.m
4. Конечно 🙂 но обратите внимание на комментарий относительно ответа, что это действительно сторонний код
Ответ №3:
Если это не установленная вами панель приложений, то это системная панель, поэтому вам нужно будет получить доступ к generalPasteBoard, а затем получить все его элементы и все типы для этих элементов и установить их значения string и data равными нулю.
generalpasteboard UIPasteBoard *pb = [UIPasteboard pasteBoardWithName:UIPasteboardNameGeneral];
for (UIPasteBoardItem *pbItem in [pb items]) {
for (NSString pbType in [pbItem pasteboardTypes]) {
[pbItem setData:nil forPasteboardType:pbType];
[pbItem setValue:nil forPasteboardType:pbType];
}
}
попробуйте поместить это в начало вашего приложения…. Все еще странно, что общий картонный блок протекает… Кстати, это также может быть поиск UIPasteboardNameFind в uipasteboardboard (также системный блокнот)
Обратите внимание, что это для выяснения, является ли это обычным картоном, который не используется в конечном распространяемом приложении. Также обязательно проверьте, не является ли проблема экземпляром UIPastBoard в любом используемом стороннем коде.
Комментарии:
1. Вау, это звучит как ужасная идея. Добавление доступа к UIPasteboard там, где его нет, и полное удаление буфера обмена пользователя без какой-либо ожидаемой выгоды. Рави, пожалуйста, не делай этого.
2. @Kevin: это не для использования в реальном приложении. Это для выяснения, вызвана ли утечка общим картоном.