loadNibNamed中的内存泄漏?

And*_*ewO 6 iphone cocoa memory-leaks nib

我即将结束我的第一个iPhone应用程序,并想通过Leaks Performance Tool运行它.在修复了一个明显的一个之后,我剩下的唯一一个是Nib充当通过loadNibNamed加载的表头视图(我在这里遵循Recipes演示).


- (void)viewDidLoad {
    [super viewDidLoad];

    if (self.tableHeaderView == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"TableHeaderView" owner:self options:nil];
        self.tableView.tableHeaderView = self.tableHeaderView;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在dealloc中:


- (void)dealloc {
    [tableHeaderView release];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

Instruments告诉我,我正在泄漏256个字节,其中2个泄漏源自loadNibNamed.tableHeaderView是Nib中唯一的顶级对象(我在调试器中验证过).有什么我忘记发布的东西吗?我误解了乐器告诉我的内容吗?这是错的吗?OS是否会在以后清理?

NSR*_*der 5

加载nib时,您负责释放nib文件中的所有顶级对象.除了TableHeaderView之外,该文件中还有什么内容吗?


小智 2

Instruments 是仅在模拟器上告诉您这一点,还是在实际设备上报告相同的情况?如果您没有在设备上获取它,那么它就是模拟器 - 并且已知会发生这种情况(它不是完全匹配)。

另外,在 dealloc 中,不是吗[self.tableHeaderView release]?您必须与您的用法保持一致。

为了避免混淆,在 .h 中,您需要声明以下内容:

NS/UI/??xxxxxx *_MyObjectName;   //notice the underscore
Run Code Online (Sandbox Code Playgroud)

然后属性是这样的:

@property .... NS/UI/??xxxxxx *MyObjectName;   //no underscore
Run Code Online (Sandbox Code Playgroud)

然后像这样合成 getter/setter:

@synthesize MyObjectName=_MyObjectName;
Run Code Online (Sandbox Code Playgroud)

最后,在整个程序中引用该对象[self.MyObjectName ...];