2012-05-07 21 views
8

自動参照カウントとともにmallocを使用する場合は、手動でメモリを解放する必要がありますか?malloc +自動参照カウント?

int a[100]; 
int *b = malloc(sizeof(int) * 100); 
free(b); 

答えて

18

はい、コードをfreeにコードする必要があります。あなたは参照カウントオブジェクトのインスタンスにそれを置く場合は、あなたのポインタが参照カウントシステム間接的に参加することができる: - 片道または

@interface MyObj : NSObject { 
    int *buf; 
} 
@end 

@implementation MyObj 

-(id)init { 
    self = [super init]; 
    if (self) { 
     buf = malloc(100*sizeof(int)); 
    } 
} 
-(void)dealloc { 
    free(buf); 
} 

@end 

freeに呼び出す執筆の周り方法はありません他にも、あなたのコードでそれを持っている必要があります。

+1

インスタンスを削除すると、ARCはdeallocを呼び出しますか? –

+2

@stasまあ、直接ではありません:ARCは '[obj release]'を呼びます - それはその唯一の仕事です。解放時にrefカウントがゼロになる結果になるときだけ、 '[obj dealloc]'が呼び出されます。 – dasblinkenlight

5

はい。 ARCはObjective-Cインスタンスにのみ適用され、malloc()およびfree()には適用されません。

+0

何について新しいint [100];? –

+0

ARCは '[ClassName alloc]'で作成されたObjective-Cインスタンスのみを処理します。 –

+0

申し訳ありませんが、 'Vertex v;'によって作られた構造体があるかどうか教えてください。 Objective-Cインスタンスとしてカウントされますか? –

0

deallocでは、nilでない場合はaddを、安全の場合はnilに代入します。いけない、mallocはinitの外で使用されるかもしれません。

@interface MyObj : NSObject { 
    int *buf; 
} 
@end 

@implementation MyObj 

-(id)init { 
    self = [super init]; 
    if (self) { 
     buf = malloc(100*sizeof(int)); 
    } 
} 

-(void)dealloc { 
    if(buf != null) { 
     free(buf); 
     buf = null; 
    } 
} 

@end 
+0

私は 'dealloc'で' buf!= NULL'をチェックする理由を理解できません。 'init'の' malloc'の後に 'buf == NULL'をチェックするべきでしょうか?もしそうなら、そのエラーを処理しますか?それでは、 'dealloc'で' buf!= NULL'をチェックする必要はありません。また、 'dealloc'の終わりに' buf = NULL'を設定する点は何ですか?特に、 'buf'がプライベートなインスタンス変数である場合、' dealloc'が呼ばれた後に 'buf'にアクセスするためにあなたのコードで何か変わったことをする必要はありませんか? – ma11hew28

+0

あなたは正しいです。 ifの唯一の理由は、クラッシュを避けるためにfree(null)を呼び出すことを避けることです。ちょうどテスト、無料(null)はクラッシュしません。 –

関連する問題