代码之家  ›  专栏  ›  技术社区  ›  jyavenard

IBOutlet,是否使用成员属性?内存泄漏?

  •  1
  • jyavenard  · 技术社区  · 14 年前

    我注意到,我写的一个程序的内存使用量,随着时间的推移不断增加。XCode的工具显示没有内存泄漏,但是您可以看到堆堆栈随着时间的推移而增长。。

    经过调查,很多内存使用都来自ibui对象。界面是用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对象没有正确释放,其内存占用将不断增加。

    标题:

    @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属性和没有assign属性会有区别,这根本没有意义!除非我完全误解了发生的事情。

    欢迎任何解释。。

    谢谢

    1 回复  |  直到 14 年前
        1
  •  3
  •   Tobi    14 年前

    您需要释放dealloc方法中的对象:

    
    
     -(void)dealloc {
       [webView release];
       [backButton release];
       [forwardButton release];
       [URL release];
       [spin release];
       [super dealloc];
    }
    
    

    编辑:

    对于保留和分配的零件,其行为如下: 如果属性是用assign创建的,则设置

    
    self.thatVariable = something;
    

    
    thatVariable = something;
    

    如果使用retain,则与以下内容相同:

    
    [thatVariable release];
    thatVariable = [something retain];
    

    因此,如果使用assign for变量来保存指向对象的指针,则无法确定对象是否在其他位置释放,这将导致访问错误。

    Afaik使用assign with object的唯一原因是获取弱引用。如果你不得不反对这两个将保留对方,没有一个会得到释放。所以这是一个你可以使用assign的地方(f、 e.经常是代表模式。对象将保留其委托,委托将保留对象。在这种情况下,代表经常被指派)