如何将对象保留在范围内,该对象在后台执行任务,该对象是从另一个对象的方法实例化的?
请参阅以下示例。对象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
答案 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