2012-03-13 6 views
4

ARCでは、保持、解放、自動解放などを心配する必要がなくなります。[super dealloc]も呼び出すことができません。 -(void) deallocメソッドは許可されていますが、呼び出されたかどうかはわかりません。Automatic Reference Counting(ARC)では、free()ステートメントはどこに置くのですか?

これはオブジェクトなどのすべてでどのように優れているのですか。-(id) initmalloc()に一致するfree()はどこに置かれますか?

例:

@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

'free(0)'はノーオペレーションなので、 '空き(fill)'は 'if(filled)free(filled);'を書くための簡単な方法です。 (私は別のポスターがこれを書いているのを見ましたが、それは受け入れられた答えではありませんので、私はここでもそれを残すと思っていました) – paulmelnikow

答えて

14

は、あなたが正しいと言えるでしょう。 deallocは、オブジェクトがARCの前に割り当て解除されたときに呼び出されます。また、自動的に行われるので[super dealloc];に電話することはできません。最後に

、あなたがfilledにメモリを割り当てるためにNSDataを使用できることに注意してください。

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

あなたがこれを行うと、あなたはときにオブジェクトが自動的に行われますよう、明示的にメモリを解放する必要はありません結果としてfilledDataが割り当て解除されます。

8

はい、あなたはMRRの下で行うと同じよう-deallocにそれを置きます。 -deallocとの唯一の違いは、[super dealloc]に電話してはならないということです。それ以外は全く同じで、オブジェクトが完全に解放されたときに呼び出されます。余談として


は、free()NULLポインタを受け入れ、何もしないので、あなたが実際に-deallocで、条件は必要ありませんでしょう。あなたはちょうどあなたがdeallocを実装し、その中にfreeを呼び出す必要があり、

- (void)dealloc { 
    free(filled); 
} 
+0

+1 – Olie

関連する問題