Objective-C - block 和内存管理?

标签 objective-c memory-management objective-c-blocks

__weak MyClass *selfReference = self;

dispatch_async(dispatch_get_main_queue(), ^{
        [selfReference performSomeAction];
    });
  • 什么时候需要将弱引用传递给 block ?
  • 此规则是否适用于 dispatch_async 以及自定义 block ?
  • block 是复制其中使用的 iVar 还是保留它们?
  • 谁拥有 block 内初始化的变量?谁应该释放他们?

最佳答案

1, 2) block 在其中保留了对象指针(任何 block ,dispatch_async block 都没什么特别的)。这通常不是问题,但会导致保留循环,因为该 block 可能与所有者对象相关联,而该所有者对象(通常是 self)可能会被该 block 保留。在那种情况下,您应该使用弱变量,然后将其重新分配给强捕获:

__weak MyClass *weakSelf = self;
self.block = ^{
    MyClass *strongSelf = weakSelf;
    ...
    [strongSelf ...];
    [strongSelf.property ...];
    [strongSelf->iVar ...];
 }

注意:如果您直接访问 iVar,编译器会将其转换为 self->iVar,从而保留 self!

3) block 只保留指针,不复制它们。

4) 在 block 内创建的变量属于该 block ,当该 block 超出范围时将被释放。

关于Objective-C - block 和内存管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12218767/

相关文章:

ios - NSURLConnection(作为 AFNetworking 的一部分)不调用 NSURLConnectionDataDelegate 委托(delegate)

ios - 如何释放 AudioFileReadPacketData 使用的内存 - Xcode 显示内存仍在使用中

android - 缩放和加载位图导致 OOM (OutOfMemoryError) (Android)

c++ - 类成员和成员函数内存位置

ios - 已终止 xcodebuild,因为它在太长时间内没有产生任何输出

iphone - 如何在动画与不动画时不重复此代码?

c# - 当仍有大量可用内存时抛出“System.OutOfMemoryException”

objective-c - 是否可以扩展现有的 Objective-C block ?

ios - 如何改进此 objective-c 代码( block 、RestKit、异步、线程)

objective-c - 在 Block 语句中分配/显示 UIAlertView