Objective c 管理调用委托回调块的对象的内存
假设我有一个类ObjectA(例如视图控制器),它执行以下操作:Objective c 管理调用委托回调块的对象的内存,objective-c,cocoa,objective-c-blocks,grand-central-dispatch,Objective C,Cocoa,Objective C Blocks,Grand Central Dispatch,假设我有一个类ObjectA(例如视图控制器),它执行以下操作: ObjectB *objectB = [[ObjectB alloc] init]; [objectB executeLongRequestThenDo:^ (NSDictionary *results) { self.datasource = results; [self.tableView reloadData]; }]; ObjectA可以随时解除分配,所以我应该能够取消objectB的请求,并告
ObjectB *objectB = [[ObjectB alloc] init];
[objectB executeLongRequestThenDo:^ (NSDictionary *results)
{
self.datasource = results;
[self.tableView reloadData];
}];
ObjectA可以随时解除分配,所以我应该能够取消objectB的请求,并告诉它在完成时不要执行块,对吗?仅仅释放它是不够的?另外,如果我在执行长请求后立即调用
release
,执行:
?否,ObjectA
在任何时候都不会被解除分配,它将被保留,直到ObjectB
完成操作
可能-[ObjectB executeLongRequestThenDo://code>将调用块上的块\u copy
。这将导致块从堆栈移动到堆,并将保留块直接引用的所有NSObject
s,即self
当ObjectB
完成时,它应该运行块,然后调用block\u release
,这将释放self
。或者,如果您有某种取消操作的方法,ObjectB
应该类似地释放该块
(ObjectB可能会通过调用执行此工作的东西,如dispatch\u async
,间接完成这一切)
参考:
至于何时应该释放objectB
:这取决于它是否在长时间运行的操作中保持自身。为了安全起见,我不会释放它,直到你知道它完全完成,这将是在你的区块结束时,或者在你调用它的取消方法之后。不,ObjectA
在任何时候都不会被释放——它将被保留,直到ObjectB
完成操作为止
可能-[ObjectB executeLongRequestThenDo://code>将调用块上的块\u copy
。这将导致块从堆栈移动到堆,并将保留块直接引用的所有NSObject
s,即self
当ObjectB
完成时,它应该运行块,然后调用block\u release
,这将释放self
。或者,如果您有某种取消操作的方法,ObjectB
应该类似地释放该块
(ObjectB可能会通过调用执行此工作的东西,如dispatch\u async
,间接完成这一切)
参考:
至于何时应该释放objectB
:这取决于它是否在长时间运行的操作中保持自身。为了安全起见,我不会释放它,直到你知道它完全完成,这将在你的区块结束时,或在你调用它的取消方法之后