假设执行了如下所示的示例块。
[testBlock testPerformWithBlock:^(BOOL finished) {
if (finished) {
self.textField.text = @"Finished";
NSLog(@"Edited to add an textfield update inside block");
}
}];
如果在块返回BOOL值之前弹出包含对象testBlock的视图控制器,会发生什么。对象是否会被正确释放?
答案 0 :(得分:0)
块内的所有内容都将保留,直到块从内存中释放。如果对象testBlock
仍在执行testPerformWithBlock
且块仍处于活动状态,则块中的所有内容都将保留。
你只在那里做NSLog
,所以什么都不会改变。
但是,如果你这样做:
if (finished) {
[self doSomething];
}
正在使用 self
,它会被保留,所以如果你将块存放在某个地方的某个地方,请务必小心
答案 1 :(得分:0)
我不明白你在问什么。您的示例中的内存管理没有问题。如果您没有明确保留某些内容,则无需明确释放它。
答案 2 :(得分:0)
你会收到警告,强烈捕捉自我内部障碍将导致保持周期不会崩溃,但你需要做的不正确,因为他们说强烈的弱舞蹈。你可以做到这一点。
__weak typeof(self)ref=self;
^(<your bock>){
__strong typeof(ref)strongSelf=ref;
if(strongSelf)//or if(!strongSelf)return;
{
[strongSelf-><variable> methodCall];
}
};
答案 3 :(得分:-2)
不会发生解除分配的错误
虽然在调用之后,“testBlock”的retainCount不会改变,但是块在运行结束之前不会被释放。
结果是程序运行完全没有问题“testBlock”dealloc与否。
示例代码如下:
- (void)lazyFetchingImage:(void (^)(void))finishBlock {
[[NSOperationQueue mainQueue] addOperationWithBlock:finishBlock];
}
MainVCAppDelegate *dd = [MainVCAppDelegate new];
NSLog(@"count==%i",[dd retainCount]);
[dd lazyFetchingImage:^{
NSLog(@"22");
}];
NSLog(@"count==%i",[dd retainCount]);
[dd release];
输出应该是:
计数== 1个
计数== 1个
22