在可可中,ARC让您不必担心保留,释放,自动释放等。它还禁止调用[super dealloc]
。允许使用-(void) dealloc
方法,但我不确定是否/何时调用它。
我知道这对于对象等非常有用,但是我在哪里放置与free()
中malloc()
匹配的-(id) init
?
示例:
@implementation SomeObject
- (id) initWithSize: (Vertex3Di) theSize
{
self = [super init];
if (self)
{
size = theSize;
filled = malloc(size.x * size.y * size.z);
if (filled == nil)
{
//* TODO: handle error
self = nil;
}
}
return self;
}
- (void) dealloc // does this ever get called? If so, at the normal time, like I expect?
{
if (filled)
free(filled); // is this the right way to do this?
// [super dealloc]; // This is certainly not allowed in ARC!
}
答案 0 :(得分:14)
您是对的,您必须实施dealloc
并在其中调用free
。当对象在ARC之前被释放时,将调用dealloc
。此外,您无法致电[super dealloc];
,因为这将自动完成。
最后,请注意您可以使用NSData
为filled
分配内存:
self.filledData = [NSMutableData dataWithLength:size.x * size.y * size.z];
self.filled = [self.filledData mutableBytes];
执行此操作时,您不必显式释放内存,因为当对象及filledData
被取消分配时,它将自动完成。
答案 1 :(得分:8)
是的,你把它放在-dealloc
中就像你在MRR下一样。与-dealloc
的唯一区别是您不得致电[super dealloc]
。除此之外,它完全相同,并在对象完全释放时被调用。
顺便说一句,free()
会接受NULL
指针而不执行任何操作,因此您实际上并不需要-dealloc
中的条件。你可以说
- (void)dealloc {
free(filled);
}