2010-08-06 37 views
2

如果我创建一个简单的类像这样当的dealloc被称为在Objective-C

@interface table : NSObject { 

    NSMutableArray *array; 
} 

@end 

,并在Init方法我称之为:array = [[NSMUtableArray alloc] init]; 并在dealloc方法我称之为:[array release];

但我有一个内存韭菜因为dealloc方法从来没有被调用过。我必须自己调用dealloc方法吗?

回答

0

当对象的保留计数达到0时,它将由运行时间标记为清理。当运行时清理对象并回收内存时,dealloc被称为给它一个机会来清除对实例变量等的任何其他对象引用。这有帮助吗?如果你想看到它叫,把

NSLog(@"%s", _cmd); 

或一个破发点,在你的dealloc方法的开始和观看调试器/控制台。

+0

如果我放置一个breakPoint,程序不会进入dealloc方法。我的课是一个单身人士,它可以改变一些东西? – alex 2010-08-06 22:14:22

0

不可以,您不应该直接拨打[self dealloc]。这是什么让你觉得-dealloc从未被称为?

编辑:您不应该也不需要致电[table dealloc]。您唯一应该发送dealloc消息的时间是覆盖dealloc并致电[super dealloc]

+0

因为我用韭菜工具运行,他说这个表韭菜,并且我在dealloc方法中放了一个断点,它从来没有调用过... – alex 2010-08-06 22:10:29

+2

那么主要问题是“你什么时候调用[myTable release ]?” – 2010-08-07 02:38:27

0

这一切看起来都正确。你的类table的实例在这里,它会在它被完全释放时调用它的方法dealloc。所以如果你使用你的课程的方式导致整个table实例泄漏,你只会有泄漏。

但是,当然,相同的规则适用于使用您的table类的任何类。