Утечка памяти UIKit - PullRequest
       1

Утечка памяти UIKit

0 голосов
/ 04 сентября 2010

Я только что использовал Instrument для проверки утечек памяти в моем приложении на iPhone 3G под управлением iOS 3.1.2.Я обнаружил, что в приборах отображается несколько утечек.Выходные данные Instruments выглядят следующим образом:

Leaked Object   #   Address       Size  Responsible Library Responsible Frame
GeneralBlock-16 2   < multiple >    32     UIKit    -[UIViewAnimationState animationDidStart:]
GeneralBlock-16 2   < multiple >    32     UIKit    -[UIViewAnimationState animationDidStart:]
GeneralBlock-16  0x163be0           16     UIKit    -[UITransitionView _didStartTransition]
GeneralBlock-16  0x160730           16     UIKit    -[UITableView(UITableViewInternal) _sectionHeaderViewWithFrame:forSectionpaque:reus eViewIfPossible:]
GeneralBlock-16  0x157060           16     UIKit    -[UIScrollView(Static) _startTimer:]
GeneralBlock-16  0x148480           16     UIKit    -[UIScrollView _endPanWithEvent:]
GeneralBlock-16  0x13d570           16     UIKit    -[UINavigationBar pushNavigationItem:]
GeneralBlock-16  0x13c8b0           16     UIKit    -[UIScrollView _updatePanWithStartDelta:event:gesture:ignoringDir ectionalScroll:]
GeneralBlock-16  0x132240           16     UIKit    -[UINavigationTransitionView transition:fromView:toView:]
GeneralBlock-16  0x126ec0           16     UIKit    -[UINavigationBar popNavigationItem]
GeneralBlock-16  0x11ad50           16     UIKit    -[UITableViewCell _saveOpaqueViewState:]

Поскольку большая часть утечек объектов поступает из UIKit (ответственная библиотека, о которой сообщает Instruments), я не уверен, нужно ли мне их удалять, или еслиэто даже имеет значение.Являются ли утечки серьезной проблемой?Если я должен исправить их, как бы я это сделал?Я не могу найти трассировку, потому что ответственная библиотека не моя.

1 Ответ

1 голос
/ 27 сентября 2011

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

1) Разработка UIView в Интерфейсном Разработчике и инициализация этого представления в UIViewController (для анимации и скрытия / отображения проблем):

Возможно, вы определили некоторые IBOutlets (в вашем .h файле), которые вы могли подключить в Интерфейсном Разработчике к Владельцу файла. Этот IBOutlets должен (насколько я знаю) всегда проектироваться как свойство (пожалуйста, не стесняйтесь исправлять меня, если я ошибаюсь), и в методе dealloc не забывайте обнулять его.

например: В заголовочном файле viewcontroller (я назвал его MyViewController.h)

@ interface MyViewController: UIViewController {

IBOutlet UIWebView * webView;

}

@ свойство (неатомное, сохраняемое) IBOutlet UIWebView * webView;

@ конец

И в .m файле viewController:

@ осуществление

@ synthesize webView;

  • (void) dealloc {

self.webView = nil; // никогда этого не забуду, иначе будет течь

[super dealloc];

}

@ end

2) Проектирование UIView в Интерфейсном Разработчике и подкласс этого Представления:

Под подклассами я подразумеваю, что вы можете создать подклассный класс UIView, а в Интерфейсном Разработчике вы устанавливаете идентификатор класса, например, MyView

например:

@ interface MyView: UIView {

IBOutlet UIWebView * webView;

}

@ свойство (неатомное, сохраняемое) IBOutlet UIWebView * webView;

@ конец

То же, что 1) (IBOutlets должны быть равны нулю при освобождении)

3) Добавление UIView в качестве подпредставления:

Никогда не забывайте удалять это представление.

Например: (в моем MyViewController я хочу добавить подпредставление)

  • (void) viewDidLoad {

UIView * aSubView = [[UIView alloc] initWithFrame: CGRectMake (0,0, 90, 90)];

aSubView.tag = 123;

aSubView.backgroundColor = [UIColor blueColor];

[self.view addSubView: aSubView];

[выпуск aSubView];

}

И

  • (void) viewDidUnload {

[[self.view viewWithTag: 123] removeFromSuperview]; // удаляем только aSubView

для (UIView * подвид в [self.view subwiews]) {// или удалить любые подвиды

[subview removeFromSuperview];

}

}

Надеюсь, это поможет!

Br Nic

...