簡體   English   中英

IBOutlet,是否使用成員屬性? 內存泄漏?

[英]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];
}

查看堆堆棧,您會發現UIActivityIndi​​catorView * 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];
}

沒別的,別無所求,然后堆堆棧不會在任何地方增長..並且UIActivityIndi​​catorView對象不會留下任何東西

我不知道為什么在這里有一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM