cocoa-touch - 是否有必要始终在 block 内使用对 self 的弱引用..?

标签 cocoa-touch cocoa objective-c-blocks

我对在 block 内使用 self 感到困惑,我浏览了一些 Apple 的文档,但仍然找不到正确的答案。

有人总是说在 block 内使用weak self,但也有人说在复制的 block 中使用weak self,没必要总是使用。

示例 1:

self.handler = ^(id response, NSError *error)
{
    self.newresponse = response; //use weak self here
};  

示例 2:

使用弱 self ;

__weak myViewController *weakSelf = self;

[UIView animateWithDuration:interval delay:0.0 options:curve animations:^
{
    [weakSelf.view.superview setTransform:CGAffineTransformMakeTranslation(0, -106)];
    //in above is it use of weak is neassary 
}
completion:^(BOOL finished)
{

}];

没有弱小的 self ;

__weak myViewController *weakSelf = self;

[UIView animateWithDuration:interval delay:0.0 options:curve animations:^
{
    [myViewController.view.superview setTransform:CGAffineTransformMakeTranslation(0, -106)];

}
completion:^(BOOL finished)
{

}];

在上面的示例中,哪些是正确的......? **我正在使用 ARC

最佳答案

您应该只使用对 self 的弱引用,如果self将保留该 block 的引用。

在您的示例中,您没有在 self 中保留对 block 的引用。 ,您仅使用与 UIView animateWithDuration: 内联的 block ,因此无需使用 __weak myViewController *weakSelf = self;

为什么会出现这样的情况呢?因为 block 将保留对使用该 block 的类中使用的任何变量的强引用。这包括 self 。现在,如果类实例本身保留了对 block 的强引用,而 block 也保留了对类实例的强引用,那么就会出现保留循环,这将导致内存泄漏。

关于cocoa-touch - 是否有必要始终在 block 内使用对 self 的弱引用..?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13194613/

相关文章:

iphone - 如何在 _NSLockError() 上设置断点

cocoa - NSPredicate:搜索 NSNumber (Cocoa)

objective-c - 屏幕截图到剪贴板可以在 Cocoa 中使用,但不能保存到文件或新邮件消息中

objective-c - 在 Objective C block 中隐藏 `self` 的成语?

ios - 以编程方式关闭 iOS 键盘的退格批量删除功能

ios - 核心数据唯一约束 - 保存时为 "Dangling reference to an invalid object"

iphone - 在核心图折线图中旋转数据标签

objective-c - 如何在不使用 NSAttributedString 的 initWithRTFD 的情况下将 NSData 转换为 NSAttributedString

ios - 这个 block 返回是如何工作的?

amazon-web-services - 使用 AWSTask,如何将 block 声明为变量