释放类对象时使用块进行内存管理

时间:2013-02-06 11:48:19

标签: ios block memory-management

假设执行了如下所示的示例块。

[testBlock testPerformWithBlock:^(BOOL finished) {
    if (finished) {
       self.textField.text = @"Finished";
       NSLog(@"Edited to add an textfield update inside block");

    }
}];

如果在块返回BOOL值之前弹出包含对象testBlock的视图控制器,会发生什么。对象是否会被正确释放?

4 个答案:

答案 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