在自动引用计数(ARC)下,我在哪里放置我的free()语句?

时间:2012-03-13 19:54:28

标签: objective-c cocoa free automatic-ref-counting dealloc

在可可中,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!
}

2 个答案:

答案 0 :(得分:14)

您是对的,您必须实施dealloc并在其中调用free。当对象在ARC之前被释放时,将调用dealloc。此外,您无法致电[super dealloc];,因为这将自动完成。

最后,请注意您可以使用NSDatafilled分配内存:

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);
}