2010-08-04 74 views
1

由于某种原因,使用loadNibNamed:会导致内存泄漏。使用loadNibNamed会留下内存泄漏

比方说,我有接口:

@interface Step : UIViewController 
{ 
    IBOutlet UIView *keyPadPopupView; 
} 
@property (nonatomic, assign) IBOutlet UIView *keyPadPopupView; 

步骤:

Step *step = [[Step alloc] initWithNibName:@"StepXib" bundle:nil]; 
[step release]; 

我似乎无法找出原因:

@synthesize keyPadPopupView; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
    { 
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) 
    { 
     [[NSBundle mainBundle] loadNibNamed:@"customNumberKeypad" owner:self options:nil]; 
     [self.view addSubview:keyPadPopupView]; 
     [keyPadPopupView release]; 
    } 
    return self; 
    } 

- (void) dealloc 
{ 
    NSLog(@"dealloc........%@", [self class]); 
    [super dealloc]; 
} 

我使用进行初始化dealloc方法永远不会被调用。 在Xib中,文件的所有者是Step,并且keyPadPopupView在IB中连接。

有什么我失踪了吗?

谢谢!

+0

因此,注释掉initWithNibName的内部块会导致dealloc按预期的方式被调用? – 2010-08-04 02:20:06

+0

我有点困惑,为什么你马上释放keyPadPopupView,而不是dealloc,因为是对象变量的习惯...... – 2010-08-04 02:21:33

+0

正确的,注释掉内部块会导致dealloc按预期调用。 我发布了keyPadPopupView,因为不管调用dealloc。 – mmilo 2010-08-04 02:30:34

回答

2

在iOS中,连接IBOutlet会导致保留该对象(与OS X不同)。将视图添加到子视图会导致它被保留。所以......从笔尖

负载 - +1(1)

添加为子视图 - +1(2)

版本 - -1(1)

你还有一个突出保留。

是否调用了viewDidUnload?通常在那里你释放所有保留的子视图。

+1

即使插座是'assign'属性? – 2011-06-20 01:13:53

+1

是的。它是笔尖加载的一部分。 OS X没有保留,所以这在iOS开发中很早就引起我的注意。 请记住,你的网点填充的笔尖并不真正意识到你的属性。你可以在IBAR上指定IBOutlet,并且没有定义属性,它可以工作。 (这是财产被引入之前的情况) – vagrant 2011-07-19 19:16:08

+0

您可以请参考文档来支持它吗?听起来你知道,我只是想找官方确认。谢谢! – 2012-06-07 16:52:55