问题标签 [retain-cycle]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
37284 浏览

ios - 在嵌套块中引用弱自我

假设我已经创建了一个弱自我

在该块内,如果我嵌套另一个块:

它会创建一个保留周期吗?我是否需要创建另一个对weakSelf 的弱引用?

0 投票
1 回答
1124 浏览

objective-c - obj-c weak self in a block: why the 2nd one doesn't need a weak self inside in two similar cases

I finally found my memory bug is caused by referring self strongly in a block. But I don't know why in a similar case, the weak is not needed:

I have a CameraCaptureManager class doing image capture tasks, and a CameraViewController has a strong property of this manager. The manager has weak delegate property pointing back to the controller.

This is where I must use weakSelf in the manager, otherwise -(void)dealloc won't be called:

The manager holds the deviceOrientationDidChangeObserver strongly, so weakSelf is needed to break the memory retain cycle. That's fine, I got that... but I find I don't have use weakSelf in a similar case in the same class:

The manager also holds the stillImageOutput strongly, but why I can use the strong "self" in the completion block? The manager object gets dealloc with this strong self inside the block. I'm confused, please shed some light.

Also do I need to use weakSelf in the 2nd case even when it won't cause any retain cycle?

0 投票
1 回答
944 浏览

objective-c - “保留的块属性不复制块 - 改用复制属性

我来自于大量面向 JavaScript 的背景,我正在尽我所能过渡到 Objective-C。自然地,我总是发现自己抓住机会在我的源代码中使用闭包函数,例如:

但是,每次我将它记入 Xcode 时,它​​都会警告我:

保留的块属性不会复制块 - 改为使用复制属性

我的理解是,由于 ARC,您不再需要在 Objective-C 中手动保留内容,所以我承认这个警告让我很生气。我假设它指的是我的闭包函数,所以据我所知,它告诉我分配这个变量:

还会导致 someMethod 被保留,从而 someMethod 的所有者继续存在吗?我做对了吗?

这有什么负面影响?如果我“复制”该块,它是否允许破坏 someMethod 的所有者,因此在任何时候我提到“self”时,在闭包方法本身内它将不再存在?除非我的闭包方法正在做一些非常琐碎的事情或不引用成员变量或方法的事情,否则我不是几乎总是想要保留该块吗?

0 投票
1 回答
139 浏览

objective-c - 如何在 Objective-C ARC 中对兄弟对象(可以是父对象)使用强和弱?

我有两个以某种方式相互关联的 Objective-C 对象。您可能会认为这是一种双向关系。使用 ARC,我知道父对象应该持有对其子对象的强引用,而子对象持有指向其父对象的弱引用。但是如果父母可以是任何一个对象呢?或者如果对象是“兄弟姐妹”?

假设我有一个 Person 类,我想实例化两个其兄弟属性相互指向的对象。

这不会导致保留周期吗?

这是另一种情况:假设我有一个 Appointment 类和 Staff 类。

在视图人员中,我可能想显示所有工作人员的约会。因此我可能会像这样实例化我的所有对象......

由于所有引用都很强大,这不会导致保留周期吗?

最后,考虑这种情况:假设我将 Appointment 的人员属性更改为 weak。

这可能会解决我的第二个问题(上述场景),但是如果我正在创建一个新约会并且我想附加一个新员工,然后将对象传递到其他地方进行处理怎么办?

因为我在 Appointment 上的工作人员属性现在很弱,当垃圾收集运行时是否有可能将其设置为 nil(因为没有对工作人员对象的强引用)?

编辑:正如@dasblinkenlight 解释的那样,该app.staff对象仍然存在,因为局部staff变量(来自buildAppointment)仍在堆栈上。但是,如果我有:

我的同事似乎通过使用两个属性来处理它,一个强,另一个弱:

然后在设置人员属性时,他们将酌情使用 setStaffStrong 或 setStaffWeak。然而,这似乎很 hacky——肯定有更优雅的解决方案吗?你将如何构建你的类来处理我的上述场景?

PS:我为这个冗长的问题道歉;我尽力解释它。:)

0 投票
2 回答
536 浏览

ios - IOS块不保留自我?

我是 ios 块编程的新手,我读过很多指南,他们说,东西被保留在一个块中,我写了一个演示来测试他们提到的保留周期。

头文件:

m 文件:在viewDidLoad

我以为数组和self会被保留,retatinCount +1;但是无论我是否执行 self.block1(),retainCount 不 +1,一切似乎都很好,数组可以释放,当弹出视图控制器时,自动释放正常。

我想念导游的东西吗?很好奇这种情况。任何人都可以给我一个带有块的保留循环代码吗?

0 投票
1 回答
138 浏览

objective-c - iOS - 在另一个 childViewController 中更改属性值时调用方法

我有同一个父级的两个 childViewController,比如methodChildand propertyChild,并且希望methodChild每次在propertyChild的属性之一中设置一个新值时调用一个方法。有什么好方法可以做到这一点?

我想到的一个解决方案是:

  • 在属性设置器中,找到另一个孩子(可能通过 parentViewController 方法和 childViewControllers 数组)并要求它执行该方法。

我对这类事情的主要担心是不小心创建了一个保留周期或某种内存泄漏,所以任何关于这方面的建议都会很棒。谢谢阅读!

0 投票
1 回答
174 浏览

objective-c - 在具有局部范围 ivars 的块内保留循环

对于我的生活,我无法弄清楚这里发生了什么。

作为概述,我有一个应用程序,我创建了一个自定义导航栏、一个自定义包含视图控制器和回调,以告诉我何时在单个视图控制器(例如大量图像)中完成了昂贵的进程。

在我的容器视图控制器中导航到子视图控制器时,在子视图控制器上设置回调以在完成一组昂贵的进程后调用过渡动画。

回调是这样创建的

这些回调在通过添加子视图控制器之前设置addChildViewcontroller:,并在 dispatch_async 块中触发,例如 this

第一次通过我的导航代码从我的容器视图控制器调用 UIViewcontroller 时,此过程会顺利进行。根据分析器的说法,在我离开它表明我的保留计数为 0 后,它也会正确转储内存。

但是,当我再次导航到同一个 UIViewcontroller 时会发生什么,图像加载速度非常快,并且doneLoadingImages调用速度也非常快,导致我的主线程挂起并导致 UI 变得无响应,直到一切都设置好 UI明智的。

我的imageForNibFromFileName:方法只是imageForContentsOfFile:内部使用的一种便利类别方法。有人对我在这里可能做错了什么有一些见解吗?

0 投票
1 回答
674 浏览

ios - AFNetworking 的保留周期

我正在编写一个包含图像的画廊,这些图像可以通过 url 加载AFNetworking

在对象Init的方法中,ImageView我调用了一个发送请求的函数。这里:

如果在ImageView屏幕的可见部分之外,- (void) dealloc则调用。我在这种方法中取消了加载图像的操作,所以:[m_operation cancel];. 我猜这些操作不会被取消,因为内存正在增加并且没有被释放。

在此处输入图像描述

我认为有保留周期。我想了解如何正确编写它。谢谢。

0 投票
3 回答
2278 浏览

objective-c - 为什么没有抛出保留周期警告?

我使用 Xcode 5 并且有一些代码

为什么没有在那里抛出保留周期警告?self 每次self在块中使用时都应该使用弱引用吗?

我还启用了警告,它给了我 100 个警告,并建议我在块Implicit retain of self within blocks中写入self->ivar.prop(不是)。ivar.prop在默认情况下禁用该警告后我应该这样做吗?

0 投票
1 回答
146 浏览

ios - 在 iOS 的 GCD 块中访问 self

当我像这样访问视图动画 API 中的 self 对象时

这会导致保留周期吗?

谢谢