如何在另一个对象中保留运行异步任务的对象并成功运行异步任务?

时间:2015-06-08 16:30:22

标签: ios objective-c asynchronous objective-c-blocks

  • 我分别有两个ClassA和ClassB的对象。
  • ClassB包含一个很大的方法,我想在后台运行异步或说其他异步线程。
  • 我有正确保留ClassA的对象,但是,我在ClassA的对象中有ClassB对象的属性。这有助于我保持ClassB的对象保持不变,直到异步方法结束。
  • 问题:当我在mainThread上运行以下代码时,它运行正常,但是当我将长时间运行的方法放在异步线程中时,objectB会立即解除分配并且没有任何反应。

     @interface ClassA : NSObject
    
     @property(nonatomic, strong) ClassB *objB;
    
     @implementation ClassA
    
     -(void)createAndExecuteB
     {
         self.objB = [ClassB getNewAndExecute];
     }
    
    
     @interface ClassB
    
     +(ClassB *)getNewAndExecute;
    
     @end
    
     @implementation ClassB
    
     -(void)timeConsumingTask
     {
        //statements
     }
    
    +(ClassB *)getNewAndExecute
    {
         ClassB * __block objB = [[ClassB alloc] init];
    
       //Here is my issue. If I remove this dispatch code and just call
       // the timeConsumingTask method, then everything works well (blocking
       // the UI thread for a while but completing the tasks properly).
       // but if I keep the dispatch code, then this object gets instantly
       // deallocated and nothing runs
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) ,^{
              [objB timeConsumingTask];
     });
    
     return objB;
     }
      @end
    

1 个答案:

答案 0 :(得分:0)

此代码应该可以正常工作,因此问题必定存在于您未向我们展示的地方。

你可能

  1. 直接致电[ClassB getNewAndExecute]而不是通过[classA createAndExecuteB];
  2. 不像你认为的那样在整个任务期间保留A实例;
  3. 在同一[classA createAndExecuteB]个实例上多次调用ClassA,这会覆盖您尝试保留的self.classB
  4. 值得注意的是,您没有显示timeConsumingTask结束时发生的事情。 ClassA或保留ClassA的任何内容如何知道timeConsumingTask已完成?那是您必须释放ClassB实例的时间,因此这很重要。

    检查1应该很容易。

    要检查2,请向deallocClassA添加ClassB方法并添加NSLog语句或在其上设置断点,以便您可以查看对象何时出现解除分配。

    要查看3,请将NSLog添加到createAndExecuteB,这样您就可以看到有多少来电。

    这是一个很好的技巧,打印对象的指针,以便您可以看到是否意外重新使用实例:

    NSLog(@"%p %p", (void *)self, (void *)self.classB);