泄漏在哪里?

时间:2010-12-08 15:46:34

标签: iphone memory-leaks ios4 instruments

仪器告诉我这段代码有漏洞。但是,我很确定我稍后会发布它。谁能告诉我这里发生了什么?

- (void) addReminderEntry{
    DataEntryController* item = [[DataEntryController alloc] initWithEntryType:REMINDER]; // it says that the leak was instantiated here
    item.delegate = self;
    [[self navigationController] pushViewController:item animated:YES];
    [item setEditing:YES animated:YES];
    [item release];// this is the place I release it
}

由于

3 个答案:

答案 0 :(得分:1)

很可能与DataEntryController类中未发布的内容有关。确保您在该课程中发布所有属性/等。

答案 1 :(得分:1)

泄漏只告诉你内存的分配位置,它无法告诉你的是从哪里开始应该释放它的代码!

所以这就是说你制作了一个视图控制器,完成后它仍然在内存中。是的,你在该代码中释放VC,但只有在你呈现它之后 - 这意味着导航控制器保留了它,可能还有其他东西。只有在调用最终版本时才会释放它。

视图控制器未被释放的主要罪魁祸首通常是让视图控制器将其自身设置为它保留的内容的委托,然后在视图控制器离开屏幕时不撤消。如果你的视图控制器是保留它的东西的委托,那么它永远不会被释放。

答案 2 :(得分:0)

事实证明这是由这个构造函数引起的:

- (DataEntryController*) initWithEntryType:(DataType) eType{
    DataEntryController* item = [[DataEntryController alloc] init];//<- here
    item.entryType = eType;
    item.allowEdit = YES;
    return item;
}

显然,iOS为每个构造函数添加了1,并使用初始'init'。

切换到:

后工作正常
DataEntryController* item = [super init];