2

別のオブジェクトのメソッドからインスタンス化された、バックグラウンドでタスクを実行するオブジェクトをスコープ内に保持するにはどうすればよいですか?

次の例を参照してください。オブジェクトAのdisplayメソッドは、オブジェクトBをインスタンス化し、そのdisplayメソッドを呼び出します。Bオブジェクトのdisplayメソッドが非同期タスクを開始すると、制御はA :: displayメソッドに戻ります。このメソッドは戻り、bObjectの割り当てが解除されます。bObjectのデータ/メソッドがバックグラウンドスレッドでアクセスされると、これは例外をスローします。

オブジェクトBのスコープを維持するための最良の方法は何ですか?オブジェクトBをAのメンバー変数として宣言できますが、これにより、オブジェクトAの存続期間全体のスコープが拡大します。

 @implementation A

   -(void) display
   {
     B* bObject = [[B alloc] init];
     [bObject display];
   }
@end

 @implementation B

   -(void) display
   {
      dispatch_async((dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0),{
       self.data = 5;
       ---------
     });
@end
4

2 に答える 2

2

以前のiOSでは、これを行うことができ、作成されたオブジェクトがデリゲートコールバックで返されると仮定して、それを解放できました。ここで、「bObject」をクラスのメンバー変数にし、終了時にnilに設定するか、Aが破棄されるのを待ってbObjectをスコープ外にする必要があります。これはARCの場合であり、「表示」が終了するとすぐにローカル変数がスコープ外になり、ARCのために割り当てが解除されると思います。

これをAに追加できます:

@property (nonatomic, strong)B *bObject;
于 2012-09-04T18:59:07.483 に答える
1

B *bObjectAのインターフェースでiVarを作成できます。どこにもbObjectをリリースしていないことを確認してください。また、bObjectのブロックから自分自身を参照したくない場合もあります。

@interface A : NSObject 
@property (strong, nonatomic) B *bObject;
@end

@implementation A
    - (void)display {
        self.bObject = [[B alloc] init];
        [self.bObject display];
    }
@end

@implementation A
    - (void)display {
        B *safeSelf = __block self;
        dispatch_async((dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0),{
            safeSelf.data = 5;
            ----
        });
    }
@end
于 2012-09-04T18:58:59.967 に答える