[英]IBOutlet, use of member properties or not? memory leak?
我注意到我編寫的程序的內存使用量隨着時間的推移不斷增加。 XCode的工具未顯示任何內存泄漏,但是您可以看到堆堆棧隨時間增長。
經調查,很多內存使用情況來自IBOutlet UI對象。 該接口是使用Interface Builder構建的。
典型用法如下:
標題:
@interface HelpViewController : UIViewController <UIWebViewDelegate> {
IBOutlet UIWebView *webView;
IBOutlet UIBarItem *backButton;
IBOutlet UIBarItem *forwardButton;
NSString *URL;
IBOutlet UIActivityIndicatorView *spin;
}
@property (nonatomic, retain) NSString *URL;
並用於:
- (void)webViewDidStartLoad:(UIWebView *)mwebView {
backButton.enabled = (webView.canGoBack);
forwardButton.enabled = (webView.canGoForward);
[spin startAnimating];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
backButton.enabled = (webView.canGoBack);
forwardButton.enabled = (webView.canGoForward);
[spin stopAnimating];
}
查看堆堆棧,您會發現UIActivityIndicatorView * spin對象未正確釋放,並且其內存占用量將繼續增長。
但是,如果我將代碼更改為:header:
@interface HelpViewController : UIViewController <UIWebViewDelegate> {
IBOutlet UIWebView *webView;
IBOutlet UIBarItem *backButton;
IBOutlet UIBarItem *forwardButton;
NSString *URL;
UIActivityIndicatorView *spin;
}
@property (nonatomic, retain) NSString *URL;
@property (nonatomic, assign) IBOutlet UIActivityIndicatorView *spin;
在代碼中,我這樣做:
synthesize spin;
- (void)webViewDidStartLoad:(UIWebView *)mwebView {
backButton.enabled = (webView.canGoBack);
forwardButton.enabled = (webView.canGoForward);
[self.spin startAnimating];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
backButton.enabled = (webView.canGoBack);
forwardButton.enabled = (webView.canGoForward);
[self.spin stopAnimating];
}
沒別的,別無所求,然后堆堆棧不會在任何地方增長..並且UIActivityIndicatorView對象不會留下任何東西
我不知道為什么在這里有一個assign屬性會有所不同,這根本沒有意義! 除非我完全誤解了正在發生的事情。
任何解釋都將受到歡迎。
謝謝
您需要在dealloc方法中釋放對象:
-(void)dealloc {
[webView release];
[backButton release];
[forwardButton release];
[URL release];
[spin release];
[super dealloc];
}
問題在第二個版本中不發生的原因是,您使用屬性assign設置了屬性,通常應對“對象屬性”使用retain,這通常用於基本數據類型,例如int,float,bool等等...
編輯:
對於保留和分配的零件,afaik的行為如下:如果該屬性是通過分配進行的,則進行設置
self.thatVariable = something;
與以下內容相同:
thatVariable = something;
如果您使用保留,它將與以下內容相同:
[thatVariable release];
thatVariable = [something retain];
因此,如果您為變量分配了持有指向對象的指針的變量,則無法確定對象不會被釋放到其他位置,這將導致錯誤的訪問。
Afaik與對象一起使用assign的唯一原因是獲得弱引用。 如果您必須反對彼此保留的對象,那么它們都不會被釋放。 因此,多數民眾贊成在一個地方,您將使用分配對象。 (通常在委托模式中。對象將保留其委托,而委托將保留對象。在這種情況下,通常分配委托)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.