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

iOS将对象保留在后台执行任务的范围内,ios,Ios,如何将从另一个对象的方法实例化的在后台执行任务的对象保留在作用域中 请参见下面的示例。对象A的显示方法实例化对象B并调用其显示方法。当B对象的display方法启动异步任务时,控件返回到A::display方法,该方法返回,bObject被解除分配。当在后台线程中访问bObject的数据/方法时,这将引发异常 维护对象B范围的最佳方式是什么?我可以将对象B声明为a的成员变量,但这将增加对象a整个生命周期的范围 @implementation A -(void) display {

如何将从另一个对象的方法实例化的在后台执行任务的对象保留在作用域中

请参见下面的示例。对象A的显示方法实例化对象B并调用其显示方法。当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

您可以在A的界面中创建iVar
B*BObObject
。只需确保您没有在任何地方发布BobObject。此外,您可能不希望从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

以前在iOS中,您可以这样做,然后假设您创建的对象返回一些委托回调,您可以释放它。现在,您必须将“bObject”作为类的成员变量,并在处理完它后将其设置为nil,或者等待销毁一个将使bObject超出范围的变量。我假设这是ARC,一旦“显示”完成,您的局部变量就超出范围,并且由于ARC而被释放

您可以将其添加到:

@property (nonatomic, strong)B *bObject;

这里的关键是“处理完对象后将其设置为nil”。这是避免将对象保留整个生命周期的正确方法。简言之,在需要时抓住对象。如果您不这样做,请释放它们。实际上,我无法重现您的问题-我在
B
上实现了
setData:
,调用时没有异常或崩溃。你的例子和你的项目中的代码有什么不同吗?这只是一个例子,但它应该崩溃了。