2011-07-06 13 views
1

これは簡単だと思いますが、大きな問題があります。オブジェクトを解放してデリゲート関数を呼び出して解放する方法

私は2 UIViewControllerを持っています.1つは "Central"です。他のコントローラは、カメラを使ってバーコードをデコードします。

UIViewController中央では、私がバーコードを実行するために呼び出す:

barCode = [[MyBarCode alloc] init] 
    [barCode openBarCodeReader]; 
    //[barCode release]; //can't release it here, this cause problem with camera 
} //function finish 

MyBarCodeオブジェクトは、プログラムの制御がかかります。まず今、いくつかの時間後に、私はこのコントローラ

を却下する必要が起動し、設定バーコードオブジェクトをと

[self presentModalViewController:barCodeView animated:YES]; 

でカメラを起動したよりのUIViewController

- (void) loadView { 
    UIView *frame = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [frame setBackgroundColor:[UIColor clearColor]]; 
    self.view = frame; 
} 

に単純なビューを、それを作成します

[barCodeView dismissModalViewControllerAnimated:YES]; 

デリゲート機能でデータを送信しましたが、今度はUIViewControllerが完了してリリースする必要があります。私は何かしようとしました:

  1. 別の代理人メッセージを送信してください。私はバーコードオブジェクトがまだ実行されているため、このデリゲート、プログラムのクラッシュで[barCode release];を行うと、次の命令に行く必要がある場合でも、

  2. 私は[self release]を送ることができますが、私はどこプログラム、それが動作しているかどうかを知るとしません。その後、 "Central" UIViewControllerに入ります。

  3. 私はプログラムが中央UIViewControllerに行く再び

    [self dismissModalViewControllerAnimated:NO]; 
    

    しかし、でこの補助UIViewControllerを却下することができます。

誰でもこの問題を解決する考えがありますか?

**編集**

は、たぶん私は答えを見つけた: 私は方法

[theDelegate BarCodeFinish]; 

のようにデリゲートを呼び出すしかし、通知でそれを呼び出すことはありません。

[[NSNotificationCenter defaultCenter] postNotificationName:@"BarCodeFinish" object:nil]; 

拳の場合、私はまだそのコールの後に次のコードを実行されますが、それはそれは内部にある機能を終了した後、第2に、呼び出しが実行され、私は何の問題もなくバーコードオブジェクトを解放することができます。これが最善の方法ですか?

答えて

1

私は理解していれば、あなたのプログラムの制御を取る第2のビューコントローラがmodaly提示され、ビューコントローラを閉じ、バーコードを公開する方法を探して?

私の意見では、これはデリゲートメソッドで行う必要があります。例:

-(void)barCodeReader:(UIViewController *)aViewController didReadBarCode:(NSUInteger)theBarCode; 

このメソッドを最初のビューコントローラに書き込み、2番目のビューコントローラのデリゲートとして設定します。 独自のプロトコルを作成することもできます...しかし、一度、2番目のView Controllerがバーコードを読み取ったら、カスタムメソッドを呼び出します。それがあるべき実装する 方法:そのメソッドが返す一度

-(void)barCodeReader:(UIViewController *)aViewController 
     didReadBarCode:(NSUInteger)theBarCode { 
    // stop the bar code reader 
    [barCode release]; 
    // dismiss the second view controller 
    // do something with theBarCode 
} 

、あなたのアプリケーションは、おそらくいくつかのインターネットがコードを送信した後、データを提供し、次のイベントを待ちます。

私は引数としてNSUIntegerを使用しましたが、独自のタイプを設定できます。 これが役立つことを願っています。

+0

ハム..多分私は少し間違って書く。それはC関数のようです。私がしたいのは単純です: 'result = [barCode openBarCodeReader]'そして '[barcode release]'です。私はカメラを開くので、私はこれを行うことはできません(そして、私はカメラを開く前にこの行に行くので、バーコードを解放することはできません)。カメラが何かをデコードすると、バーコードオブジェクトに機能を送ります。今私はこれをセントラルビュー(または中央オブジェクト、同じです)に戻したいと思います。私はデリゲートを使ってこのデータを送信します。 「中央」はこれを続けることができます。しかし、私はバーコードをリリースする必要があります。バーコードをリリースして次の行に行くとクラッシュする – Rodrigo

+0

解決策が見つかると思います。私は[[NSNotificationCenter defaultCenter] postNotificationName:@ "BarCodeFinish"オブジェクト:nil]; 'を送ることができます。これはオブジェクトの外側で実行され、私はそれを解放することができます。私はこのGOTOスタイルを使用するのが好きではありません...しかし、あなたの時間をありがとう。 – Rodrigo

+0

RodrigoはMyBarCodeではないバーコードのラッパークラスですか?またはそれはカスタムUIViewControllerサブクラスですか? 2番目のView Controllerはカメラを管理するのではなく、中央のコントローラは2番目のビューコントローラを管理し、何かをデコードするのを待ちます。 'MyBarCode'がラッパークラスの場合、*カメラを設定してコードをキャプチャしないでください。もしそうでなければ、あなたの' openBarCodeReader'は何をすると思いますか? ? –

0

なぜ自動解除ではないのですか?

barCode = [[[MyBarCode alloc] init] autorelease]; 
+0

私は多くのオートリリースを理解していないと思います。関数変数にのみ使用されましたか?私の質問はいつだった:それがリリースされるとき。私は機能の終わりの後であると思います、そして、私はこの場合に別の機能を持つ必要があります。 – Rodrigo

+0

機能の直後ではありません。 Autoreleaseはオブジェクトが使用されなくなったときにオブジェクトを解放します。これを見てくださいhttp://stackoverflow.com/questions/3439884/when-is-the-autorelease-pool-triggered/3442414#3442414 – domino

関連する問題