2

私はこれについてメモリリークしています:

私のカスタムクラス:

+ (id)vectorWithX:(float)dimx Y:(float)dimy{
return [[[Vector alloc] initVectorWithX:dimx Y:dimy] autorelease]; }


- (Vector*)add:(Vector*)q {
return [[[Vector vectorWithX:x+q.x Y:y+q.y] retain] autorelease]; }

アプリデリゲートで開始します:

Vector *v1 = [[Vector alloc] initVector];
Vector *v2 = [[Vector alloc] initVector];       
Vector *vtotal = [[v1 add:v2] retain];

[v1 release];
[v2 release];
[vtotal release];

これはどのように漏れますか?それらを適切にリリースまたは自動リリースします。これらを保持しないと、アプリがすぐにクラッシュします。これは、初期のリリースが原因だと思います。別のリリースを追加するとクラッシュします。

4

1 に答える 1

2

なぜあなたはあなたが記憶を漏らしていると思いますか?それから始めましょう。また、アクセス時にどのオブジェクトがクラッシュしますか?これにより、保持不足がどのオブジェクトに関連している可能性が高いかがわかります。推測しなければならない場合、それがメソッドの非常に奇妙な名前であるという理由だけで、initVectorを疑うでしょう。それは何をするためのものか?なぜ「init」と呼ばれないのですか?

これはスレッド化されたコードですか?一般的に適切なよりもはるかに多くの保持/自動解放を行っています。現在のイベントループでオブジェクトを保持するために、オブジェクトを保持する必要はありません。一般的に言えば、ivarのみを保持します。これは、ivarが次のイベントループで必要になるためです。アクセサの外部で保持するための呼び出しがたくさんある場合は、ほぼ間違いなくメモリを誤って管理しています。上記は次のようになります。

+ (id)vectorWithX:(float)dimx y:(float)dimy
{
    return [[[Vector alloc] initVectorWithX:dimx y:dimy] autorelease];
}

- (Vector*)add:(Vector*)q
{
    return [Vector vectorWithX:(self.x + q.x) y:(self.y + q.y)];
}

...

Vector *v1 = [[Vector alloc] initVector];
Vector *v2 = [[Vector alloc] initVector];
Vector *vtotal = [v1 add:v2];
...
[v1 release];
[v2 release];

個人的には、v1 / v2を自動リリースで処理します。これは、コードがより保守可能で理解しやすいものになると思うからですが、他の考え方もあります。

Vector *v1 = [[[Vector alloc] initVector] autorelease];
Vector *v2 = [[[Vector alloc] initVector] autorelease];
Vector *vtotal = [v1 add:v2];
于 2010-03-12T19:55:45.820 に答える