2011-01-28 3 views
0

で変数を解放するとき、私は私のビューコントローラに以下の行を持っている:Objective-Cの

-(void) retrieveAccounts { 
    accounts = [[NSMutableArray alloc] init]; 
    selAccounts=[[NSMutableArray alloc] init]; 
    NSString *url=[NSString stringWithFormat:@"https://host/accts"]; 
    processor=[[AsynConnectionProcessorController alloc] init]; 
    processor.delegate=self; 
    processor.server=self.server; 
    [processor createRequestfromURL:url]; 
} 

AsynConnectionProcessorControllerクラスは、非同期モードでurlからデータをロードするためにNSURLConnectionを作成します。 createRequestfromURLメソッドで接続を作成します。後でconnectionDidFinishLoadingでページを受け取ると、上記のスニペットで設定したデリゲートに対してprocessDataメソッドが呼び出されます。 processDataはtableViewなどを更新します。

私の質問は、上記で作成したプロセッサ変数をリリースできるときです。私はautoreleaseを呼び出すべきですか?上記の行の後に[プロセッサのリリース]を置くと、コントロールは次のコード行に表示されますか? [プロセッサcreateRequestfromURL:url]

注:これまでと同様の質問がありますが、ここで別の質問。

答えて

2

processDataを実行するデリゲートの呼び出しまでプロセッサが必要なようです。ここで私は通常、何をすべきかです:

  1. は、デリゲートのプロトコルを宣言し、このような呼び出しを行うオブジェクトへの参照であることを法では、例えばconnectionProcessor:didProcessData:
  2. デリゲートコールバックでは、コールバックで返された参照のreleaseを呼び出します。

このようにして、デリゲートはオブジェクトが完了した時点を決定します。

0

私はそれほど長い間、objective-cで作業していないので、これを巨大な山積みで取ることができますが、私の推測はオートリリースです。 autoreleasepoolが破壊されたときに解放されます。

+0

自動解放は最適ではありません。接続に時間がかかる場合は、要求が返される前にプールが排水される可能性があります。 – kevboh

1

リリース時期? オブジェクトをもう必要としないときに解放します。それ以外の場合、メモリを無駄にしてしまいます。

getterメソッドのように、本当に必要な場合にのみautoreleaseを使用してください。 Autoreleaseには少しオーバーヘッドがあります+あなたが必要としない可能性が最も高いオブジェクトはメモリに長く保存されます。自動リリースされたオブジェクトがたくさんある場合は、システムメモリがいっぱいになるとiphoneアプリがシャットダウンされる可能性があります。 Macでは、私が推測するautoreleaseについてはあまり気にしないはずですが、本当に必要な場合はautoreleaseだけを使用する方が良いでしょう。あなたが自動解放を使用しているとき

はまた、あなたが作るお奨め彼は、現在の自動解放プールがポップされた後、あなたがオブジェクトを使用しようとしていないことを確認=> EXC_BAD_ACCESクラッシュ

関連する問題