0

次のコードでリークされたオブジェクトがあります。どうすれば修正できますか?[apiViewControllerリリース]を追加してみました。しかし、私がアプリを分析すると、私はまだ:を取得します

ここに画像の説明を入力してください

 if (idx == 2) {
        NSLog(@"you touched menu 2");

        APICallsViewController *apiViewController = [APICallsViewController alloc];
        [self.navigationController pushViewController:apiViewController animated:YES]; 
        //[apiViewController getFriendsCallAPIDialogFeed];
        [apiViewController getAppUsersFriendsUsing];


    }

助けてくれてありがとう

4

3 に答える 3

3

-initと-releaseを忘れています。

APICallsViewController *apiViewController = [[APICallsViewController alloc] init];
...
[apiViewController release];

あなたはおそらくObjective-Cプログラミングについて読む必要があります。

于 2012-05-20T13:17:57.667 に答える
1

まず、hwaxxerとJustin Booが示唆しているように、initが必要です。

第二に、何人かの人々がを使用することを提案しautoreleaseました。これautoreleaseは延期されreleaseており、必要がない限り、通常はそうすべきではありません(たとえば、メソッドがオブジェクトを呼び出し元に返すことができるように、リリースを後で延期する必要があります)。したがって、要するに、autoreleaseオブジェクトをメソッドの呼び出し元に返す場合にのみ使用し、それ以外の場合はを使用しますrelease。この場合、を使用する必要がありますrelease

この特定のシナリオでは、問題ではありません(View Controllerを押すと、とにかく保持され、そのビューがスタックからポップされるまで解放されないため)が、独自のメモリ管理を行う場合は(つまり、ARCを使用しない)場合は、適切な方法を採用する価値があります。つまり、release可能な場合はいつでも(この場合など)、autoreleaseオブジェクトをメソッドの呼び出し元に返すため、を延期する必要がある場合に限りますrelease

第三に、高度なメモリ管理を読んで理解しておくことをお勧めします。これにより、実際に理解する必要のあるメモリ管理の基本的なルールがいくつか得られます(たとえば、作成する場合は所有し、解放する必要があります)。

第4に、メモリ管理に習熟したら(そして、何が起こっているのかを本当に理解するのに役立つので、習得した後でのみ)、ARCへの移行を真剣に検討することをお勧めします。愚かさ。

于 2012-05-20T14:26:58.650 に答える
0

あなたが割り当て/保持するすべてのオブジェクトについて、あなたは解放する責任があります。

[apiViewController getAppUsersFriendsUsing];

置く...

[apiViewController release];
于 2012-05-20T13:15:42.770 に答える