问题:当我在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
答案 0 :(得分:0)
此代码应该可以正常工作,因此问题必定存在于您未向我们展示的地方。
你可能
[ClassB getNewAndExecute]
而不是通过[classA createAndExecuteB]
; [classA createAndExecuteB]
个实例上多次调用ClassA
,这会覆盖您尝试保留的self.classB
。值得注意的是,您没有显示timeConsumingTask
结束时发生的事情。 ClassA
或保留ClassA
的任何内容如何知道timeConsumingTask
已完成?那是您必须释放ClassB
实例的时间,因此这很重要。
检查1应该很容易。
要检查2,请向dealloc
和ClassA
添加ClassB
方法并添加NSLog
语句或在其上设置断点,以便您可以查看对象何时出现解除分配。
要查看3,请将NSLog
添加到createAndExecuteB
,这样您就可以看到有多少来电。
这是一个很好的技巧,打印对象的指针,以便您可以看到是否意外重新使用实例:
NSLog(@"%p %p", (void *)self, (void *)self.classB);