Objective c 管理调用委托回调块的对象的内存

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的请求,并告

假设我有一个类ObjectA(例如视图控制器),它执行以下操作:

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
:这取决于它是否在长时间运行的操作中保持自身。为了安全起见,我不会释放它,直到你知道它完全完成,这将在你的区块结束时,或在你调用它的取消方法之后