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 № 1Powinieneś 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