Где в автоматическом подсчете ссылок (ARC) я могу разместить свои операторы free ()? - PullRequest
4 голосов
/ 13 марта 2012

В какао 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 ]

14 голосов
/ 14 марта 2012

Вы правы, вам нужно реализовать dealloc и вызвать free внутри него.dealloc будет вызываться, когда объект освобождается, как и раньше ARC.Кроме того, вы не можете вызвать [super dealloc];, поскольку это будет сделано автоматически.

Наконец, обратите внимание, что вы можете использовать NSData для выделения памяти для filled:

self.filledData = [NSMutableData dataWithLength:size.x * size.y * size.z];
self.filled = [self.filledData mutableBytes];

Когда вы делаете это, вам не нужно явно освобождать память, поскольку это будет сделано автоматически, когда объект и, следовательно, filledData будут освобождены.

8 голосов
/ 14 марта 2012

Да, вы вводите его в -dealloc точно так же, как в MRR.Единственная разница с -dealloc в том, что вы не должны звонить [super dealloc].Кроме этого, он точно такой же, и будет вызван, когда объект будет полностью освобожден.


Кроме того, free() примет указатель NULL и ничего не сделает, так что вы не будетене нужно это условное в -dealloc.Вы могли бы просто сказать

- (void)dealloc {
    free(filled);
}
...