/ / UIKit Memory Leak - iphone, wycieki pamięci

UIKit Memory Leak - iphone, wycieki pamięci

Właśnie użyłem Instrument, aby sprawdzić wycieki pamięci w mojej aplikacji na iPhone 3G z systemem iOS 3.1.2. Zauważyłem, że w Instrumentach jest kilka wycieków. Dane wyjściowe Instrumentów są następujące:

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:]

Ponieważ pochodzi większość wyciekanych obiektówUIKit (odpowiedzialna biblioteka zgłoszona przez Instruments), nie jestem pewien, czy muszę je wyczyścić, czy nawet robi to jakąś różnicę .. Czy wycieki są poważnym problemem? Jeśli muszę je naprawić, jak to zrobię ? Nie mogę znaleźć śladu, ponieważ odpowiedzialna biblioteka nie jest moja.

Odpowiedzi:

1 dla odpowiedzi № 1

Powinieneś o nich dbać! Obecnie znajduję takie wycieki. Istnieje kilka możliwości, dlaczego mogą się pojawić:

1) Projektowanie UIView w programie Interface Builder i inicjowanie tego widoku w UIViewController (w przypadku animacji i ukrywania / pokazywania problemów):

Możliwe, że zdefiniowałeś kilka IBOutletów (w twoim.h pliku), który mógł być podłączony w Konstruktorze interfejsów do właściciela pliku. Ten IBOutlets powinien (o ile mi wiadomo) zawsze być zaprojektowany jako właściwość (proszę, popraw mnie, jeśli się mylę) w metodzie dealloc nie zapomnij o tym "zerem".

na przykład: W pliku nagłówkowym viewcontroller File (nazwałem go MyViewController.h)

@interface MyViewController: UIViewController {

IBOutlet UIWebView * webView;

}

@property (nonatomic, retain) IBOutlet UIWebView * webView;

@koniec

Oraz w pliku .m pliku viewController:

@realizacja

@synthesize webView;

  • (void) dealloc {

self.webView = zero; // nigdy o tym nie zapomnij, a przecież wycieknie

[super dealloc];

}

@koniec

2) Projektowanie UIView w Konstruktorze interfejsów i podklas tego widoku:

Z podklasą mam na myśli to, że możesz stworzyć podklasowaną klasę UIView, a w Konstruktorze interfejsów ustawić identyfikator klasy na przykład MyView

na przykład:

@interface MyView: UIView {

IBOutlet UIWebView * webView;

}

@property (nonatomic, retain) IBOutlet UIWebView * webView;

@koniec

Taki sam jak 1) (IBOutlety powinny być ustawione na zero w przypadku dealokacji)

3) Dodawanie UIView jako wyekspozycji:

Nigdy nie zapomnij usunąć tego widoku.

np: (w moim MyViewController, chcę dodać wywiad)

  • (void) viewDidLoad {

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

aSubView.tag = 123;

aSubView.backgroundColor = [UIColor blueColor];

[self.view addSubView: aSubView];

[wydanie aSubView];

}

I:

  • (void) viewDidUnload {

[[self.view viewWithTag: 123] removeFromSuperview]; // usuń tylko aSubView

dla (UIView * subview w [self.view subwiews]) {// lub usuń wszelkie subviews

[wyślij removeFromSuperview];

}

}

Mam nadzieję, że to pomoże!

Br Nic