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 *bObject您可以在 A 的界面中创建 iVar 。只要确保您没有在任何地方释放 bObject 即可。此外,您可能不想从 bObject 的块中引用 self。

@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 回答