【问题标题】:Memory management with blocks when class object is released释放类对象时使用块进行内存管理
【发布时间】:2013-02-06 11:48:19
【问题描述】:

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

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

    }
}];

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

【问题讨论】:

  • block语句保留它正在调用的对象,并在block语句执行时释放它。
  • @Krishnabhadra:在这种情况下,这无关紧要。该块根本没有捕获任何变量

标签: ios block memory-management


【解决方案1】:

块内的所有内容都会保留,直到该块从内存中释放。如果对象 testBlock 仍在执行 testPerformWithBlock 并且块仍然存在,则块内的所有内容都将保留。

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

但是,如果你这样做:

if (finished) {
    [self doSomething];
}

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

【讨论】:

  • 视图控制器弹出时是否可以释放块?
  • 我不知道谁投了反对票,但想知道在弹出视图控制器时如果块包含[self doSomething]; 应该怎么做
【解决方案2】:

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

【讨论】:

  • 假设块由一个对象组成,比如 ViewController 的文本字段,那么会发生什么?视图控制器会被正确释放吗?
  • “块由一个对象组成”是什么意思?这没有意义。
  • 我的意思是,如果我使用textfield.text = @"Test";,而不是我的示例中使用的 NSLog,其中 textField 是当前视图控制器中的 ibOutlet。
  • @Rajkumar:如果textField 是一个实例变量,那么您隐式使用self,这意味着该块将保留self。如果testBlock 也是一个实例变量,那么您可能有一个保留周期。您应该查看有关如何处理保留周期的其他问题。
【解决方案3】:

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

__weak typeof(self)ref=self;

^(<your bock>){

__strong typeof(ref)strongSelf=ref;

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

}
};

【讨论】:

    【解决方案4】:

    不会有释放错误。
    虽然“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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      相关资源
      最近更新 更多