Утечка памяти в NavigationController / TableView в Iphone - PullRequest
0 голосов
/ 07 декабря 2010

Недавно я закончил свое первое приложение для Iphone, и оно работает отлично… за исключением случаев, когда я проводил интенсивную сессию, используя инструменты, чтобы найти утечки через некоторое время без утечек, внезапно получилось около 1,3 КБ.В трассировке стека все они указывают на точную строку, на которой я выпускаю UIViewControler после отправки его на контроллер навигации (я опубликую этот код чуть ниже).Утечка, кажется, случается через некоторое время, перемещаясь через ViewControlers и обратно.Я знаю, что это очень общий вопрос, но я надеюсь, что кто-то может указать мне правильное направление.Я потратил несколько дней, пытаясь решить эту проблему, и это начинает сводить меня с ума!

Мое приложение основано на навигации, вот как оно работает в двух словах:

Начинается сUIViewControler, который при нажатии кнопки переходит к другому UIViewControler, содержащему TableView.Отсюда, в зависимости от содержимого массива, который заполняет TableView, он может перейти к UIViewControler, содержащему PickerView, затем к последнему UIViewControler или просто перейти прямо к последнему UIViewControler, минуя один с PickerView.

Вот код, который трассировщик стека сообщает о включенной утечке:

SoundConfiger *third = [[SoundConfiger alloc] initWithNibName:@"SoundConfiger" bundle:[NSBundle mainBundle]];
    [third setTitle:@"Sound Link"];
    third.myData = myData;
    third.selectedRow = row;
    third.currentChoise = nil;
    [self.navigationController pushViewController:third animated:YES];
    [third release];    <---- Instruments says the leak is here on this line.

Разве теперь NavigationController не должен нести ответственность за этот UIViewcontroler?Я нигде не вызывал сохранение на третьем месте, и он существует только в этой функции.

У меня есть куча утечек из UIkit и QuartsZone.У меня есть скриншот ниже некоторых из них, в трассировке стека все указывают на один и тот же фрагмент кода, в той же функции, в том же объекте, как указано выше в некоторый момент в трассировке:

Здесьявляется ссылкой на изображение, поскольку я пока не могу публиковать изображения: Ссылка больше не действительна

Вот завершенная трассировка стека от первого GeneralBlock-16 в списке.Жирным шрифтом (строка 29) является фрагмент кода выше:


0 libSystem.B.dylib malloc

1 CoreFoundation - [__ NSArrayM insertObject: atIndex:]

2 CoreFoundation - [__ NSArrayM addObject:]

3 UIKit - [UIView (UIViewGestures) addGestureRecognizer:]

4 UIKit - [UISwitch _commonInit]

5 UIKit - [UISwitch initWithCoder:]

6 UIKit UINibDecoderDecodeObjectForValue

7 UIKit UINibDecoderDecodeObjectForValue

8 UIKit - [UINibDecoder декодирование] 10 * UID]

10 UIKit UINibDecoderDecodeObjectForValue

11 UIKit - [UINibDecoder decodeObjectForKey:] *

12 UIKit - [UIRuntimeConnection initWithCoder:1048 * 14 UIKit UINibDecoderDecodeObjectForValue

15 UIKit - [UINibDecoder decodeObjectForKey:] *

16 UIKit - [UINib instantiateWithOwner: параметры:]

17 UIK- [NSBundle (UINSBundleAdditions) loadNibNamed: владелец: опции:]

18 UIKit - [UIViewController _loadViewFromNibNamed: bundle:]

19 UIKit - [UIViewController loadView]

* 1060 20- [Представление UIViewController]

21 UIKit - [UIViewController contentScrollView]

22 UIKit - [UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:]

* Контроллер UIN UC:1068 * 24 UIKit - [UINavigationController _startTransition: fromViewController: toViewController:] *

25 UIKit - [UINavigationController _startDeferredTransitionIfNeeded]

26 UIKit - принудительная 10-минутная проверка* 27 UIKit 0x6ea9b5

28 UIKit - [UINavigationController pushViewController: animated:]

29 Booby Trap - [SelectEventTypeviewcontroler ChooseThisOne] / Пользователи / chriswyllie / Documents / Booby TrabyКлассы / SelectEventTypeviewcontroler.m: 91

30 CoreFoundation - [NSObject (NSObject) executeSelector: withObject: withObject:]

31 UIKit - [UIApplication sendAction: к: от: forEvent:]

32 UIKit - [UIApplication sendAction: toTarget: fromSender: forEvent:]

33 UIKit - [UIControl sendAction: to: forEvent:]

34 UIKit - [UIControl (Internal) _sendActionsForEvents: withEvent:]

35 UIKit - [UIControl затрагивает Ended: withEvent:]

36 UIKit - [UIWindow _sendTouchesForEvent:]

37 UIKit - [UIWindow sendEvent:]

38 UIKit - [UIApplicationSendEvent:] * 1 099

39 UIKit _UIApplicationHandleEvent

* * +1102 40 GraphicsServices PurpleEventCallback

41 CoreFoundation CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION

42 CoreFoundation __CFRunLoopDoSource1

43 CoreFoundation __CFRunLoopRun

44 CoreFoundation CFRunLoopRunSpecific

45 CoreFoundation CFRunLoopRunInMode

46 GraphicsServices GSEventRunModal

47 GraphicsServices GSEventRun

48 UIKit - [UIApplication _run]

49 UIKit UIApplicationMain

50 Главная / пользователи / chriswyllie / Документы / BoobyTrap / Booby Trap / main.m: 14

51 Начало Booby Trap


Спасибо за вашу помощь заранее, я надеюсь, что просто делаю что-то глупое и мне нужно свежеенабор глаз, чтобы увидеть это.Дайте мне знать, если вам нужна дополнительная информация.

Ответы [ 2 ]

3 голосов
/ 10 декабря 2010

Ну, я Инструмент:)

Я неправильно обрабатывал IBOutlets в каждом viewControler.

Я не объявлял каждый IBOutlet, используя @property с сохранением, используя "self".someLabel = nil "(чтобы освободить и установить для IBOutlets значение nil) в методе viewDidUnload для предупреждения о памяти, а затем, наконец, выпустить в инструменте dealloc.

.lol

То, что я делал, объявлял: «IBOutlet UILabel * someLabel;»в заголовке без @property, и это вызвало утечки, показанные выше, они не происходят сразу, это занимает некоторое время, и когда они выполняют трассировку стека, и каждая вещь не помогает многим.

Единственный способ, которым я обнаружил, что то, что просочилось, - это убрать все из моего приложения, и я имею в виду все, пока утечка не исчезла.результат.

Вот соответствующая ссылка, чтобы показать, как правильно делать IBOutlet: Что произойдет, если я не сохраню IBOutlet?

0 голосов
/ 07 декабря 2010

SoundConfiger * third = [[[SoundConfiger alloc] initWithNibName: @ Комплект «SoundConfiger»: [NSBundle mainBundle]] авто-релиз];

и удалите

[третий выпуск]; эта строка.

Вы можете исправить только те утечки, которые происходят из-за вашего кода (забудьте освободить любой объект или некоторые неправильные вещи). Но через некоторое время вы получаете дополнительные утечки, которые присутствуют в iphone SDK. На самом деле некоторые функции или свойства iPhone имеют утечки. Так что их можно исправить, только если вы измените их использование. И еще одна утечка в 1,3 КБ - это неплохо, если ее не будет увеличивать с операциями приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...