开发者

UIKit Memory Leak

I just used Instrument to check for memory leaks in my app on an iPhone 3G running iOS 3.1.2. I found that there are several leaks displayed in Instruments. The Instruments output is as follows:

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 _开发者_JAVA技巧saveOpaqueViewState:]

Because most of the leaked objects come from UIKit (the responsible library reported by Instruments), I'm not sure whether or not I need to clear them, or if it even makes a difference. Are the leaks a serious issue? If I must fix them, how would I do that? I cannot find the trace because the responsible library is not mine.


You should care about them! I currently track down such leaks. There are several possibilities, why they may occure:

1) Designing a UIView in the Interface Builder and initialize this view in a UIViewController (for animations and hiding/showing issues):

You may have defined some IBOutlets (in your .h file), which you might have connected in the Interface Builder to the File's Owner. This IBOutlets should (as far as i know) always be designed as a property (please feel free to correct me, if i'm wrong) and in the dealloc method, don't forget to "nil" it.

e.g: In the viewcontroller header File (i named it MyViewController.h)

@interface MyViewController : UIViewController<UIWebViewDelegate>{

IBOutlet UIWebView* webView;

}

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

@end

And in the viewController's .m file:

@implementation

@synthesize webView;

- (void) dealloc {

self.webView = nil; //never forget this, otherwhise it will leak

[super dealloc]; 

}

@end 

2) Designing a UIView in the Interface Builder and subclass this View:

With subclassing i mean, that you can create a subclassed UIView Class and in the Interface Builder you set the class identifier to for example MyView

e.g:

@interface MyView : UIView<UIWebViewDelegate> {

IBOutlet UIWebView* webView;

}

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

@end

Same as 1) (IBOutlets shoud be set nil on deallocation)

3) Adding a UIView as subview:

Never forget to remove this view.

e.g: (in my MyViewController, i want to add a subview)

- (void) viewDidLoad {

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

aSubView.tag = 123;

aSubView.backgroundColor = [UIColor blueColor];

[self.view addSubView:aSubView];

[aSubView release];

}

And:

- (void) viewDidUnload {

[[self.view viewWithTag:123] removeFromSuperview]; //remove only aSubView

for (UIView *subview in [self.view subwiews]) { //or remove any subviews

[subview removeFromSuperview];

}

}

Hope it helps!

Br Nic

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜