Утечки в объектах UIPasteboard

#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: это не для использования в реальном приложении. Это для выяснения, вызвана ли утечка общим картоном.