1

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

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

    }
}];

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

4

4 回答 4

0

块内的所有内容都会保留,直到该块从内存中释放。如果对象testBlock仍在执行testPerformWithBlock且块仍处于活动状态,则保留块内的所有内容。

你只是NSLog在那里做一个,所以什么都不会改变。

但是,如果您这样做:

if (finished) {
    [self doSomething];
}

self正在使用,它会被保留,所以如果你将块存储在某个地方的某个 ivar 中,请小心

于 2013-02-06T11:52:36.217 回答
0

我不明白你在问什么。在您的示例中,内存管理没有问题。如果您没有显式保留某些内容,则不需要显式释放它。

于 2013-02-06T18:55:56.547 回答
0

您将收到警告,在块内强烈捕获自我将导致保留周期,它不会崩溃,但您需要这样做是不合适的,因为他们说强弱舞蹈。您可以这样做。

__weak typeof(self)ref=self;

^(<your bock>){

__strong typeof(ref)strongSelf=ref;

if(strongSelf)//or if(!strongSelf)return;
{
[strongSelf-><variable>  methodCall];

}
};
于 2014-05-05T17:55:55.133 回答
-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];

输出应该是:
count==1
count==1
22

于 2013-11-22T09:28:57.197 回答