iOS将对象保留在后台执行任务的范围内

时间:2012-09-04 18:55:34

标签: ios

如何将对象保留在范围内,该对象在后台执行任务,该对象是从另一个对象的方法实例化的?

请参阅以下示例。对象A的显示方法实例化对象B并调用其显示方法。当B对象的显示方法启动异步任务时,控制返回到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

2 个答案:

答案 0 :(得分:2)

以前在iOS中你可以做到这一点,然后假设你创建的对象返回了一些委托回调你可以释放它。现在,您必须使“bObject”成为您的类的成员变量,并在完成它时将其设置为nil或等待A被销毁,这将使bObject超出范围。我假设这是使用ARC,一旦“显示”结束,你的局部变量超出范围并因ARC而被释放。

您可以将其添加到A:

@property (nonatomic, strong)B *bObject;

答案 1 :(得分:1)

您可以在A的界面中创建iVar B *bObject。只是确保你没有在任何地方发布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