问题标签 [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 投票
1 回答
66 浏览

ios - 在 SplitView 中设置两个 View 以保持对彼此的引用是不是很糟糕?

我目前正在编写一个 RSS 程序,其中我的 splitViewController 的视图必须相互通信。它们目前都持有彼此的属性实例,如下所述,在 App Delegate 中声明。我想知道这是否是不好的编程习惯,如果是,我应该怎么做才能避免它?

/ ----------------------------------------- /

0 投票
1 回答
1071 浏览

objective-c - 从 GCD dispatch_async 块中调用 super:安全吗?

我有点苦恼。我知道从块中调用 [self methodName] 将导致保留周期。

然而,在这个类中,由于多线程,我不能允许从块以外的任何其他地方访问块正在访问的方法,因为它可能会导致严重的问题。

当前代码:

正是这样做的,它调用[self getmethod]。虽然调度的块可以运行此方法,但我不希望此类之外的任何东西调用此方法。那么,是否可以像这样覆盖这个继承的方法:

然后将块更改为:

我已经尝试过了,它可以在不调用 [self getMethod] 的情况下工作,但是超级会被保留、正确释放等吗?是的,我正在使用 ARC。在一个块内调用 super 会导致任何问题吗?有没有办法让 __weak 改为 super ?

或者,我怎样才能禁止直接调用 [self getMethod] (它是继承的)并且只在内部使用它?我知道 Objective-C 并没有完全实现这一点,但我知道有一些技巧,比如只在实现文件中声明和实现一个方法。

编辑#1:

我尝试过使用 SEL & IMP 和函数指针。问题是 IMP 和函数指针需要一个实例作为参数,这使得孔点静音:

这只是调用继承的方法。尝试将它与 super 一起使用只会产生错误。在这一点上,我将继续并简单地在块内使用 super,并尝试分析它是否会导致任何保留周期。

编辑#2:

根据 newacct 的回答,这就是我最终要做的事情:

我希望这应该避免任何保留周期,尽管我还没有真正分析它。

0 投票
3 回答
189 浏览

ios - 类保留计数

这里有很多关于避免使用块的保留循环的文章,但是在使用类和类方法时呢?假设我有这样的课程:

来电者想说:

调用者必须声明 MyClass 的 unsafe_unretained 副本吗?还是像单例这样的类,不会增加它的保留计数?既然我们希望它一直存在,我们是否将一个类的保留计数发送到月球是否重要?

0 投票
1 回答
2247 浏览

ios - 不使用 ARC 时替换 __weak

我有这行代码:

这是触发此编译器错误:

原因是我没有启用 ARC(还没有准备好进行切换)。所以从另一个 StackOverFlow 问题中,我被推荐使用:

这使错误消失了,但是对于我正在使用它的上下文,它不起作用(如果有兴趣,请参阅此问题:如何取消 NSOperationQueue)。

所以我的问题是,在这种情况下我可以用什么替换__weak关键字来消除这个警告?当我使用 时,一切实际上都正常工作__weak,但我担心它不会支持未来版本的 iOS。

0 投票
1 回答
148 浏览

ios - 在弱指针上调用 getter 并将其传递给方法时保留循环可能性

我整天都在阅读更多关于保留周期的内容,我开始感到困惑。所以我只想检查几件事。(只是为了澄清,我使用的是 ARC)

所以假设我有MyFirstClass. MyFirstClass有一个强烈指向的(默认情况下)实例变量MyChildClass

MyFirstClass还有一个 getter(在 .h 中公开可用),如下所示:

现在假设我完全有另一堂课,MySecondClass. MySecondClass有一个弱实例变量指向MyFirstClass如下:

有一个父类同时拥有两者MyFirstClassMySecondClass因此MySecondClass只有一个弱引用,MyFirstClass因此它不会阻止父类在需要时释放它。

MySecondClass也有它自己的子类,也被一个实例变量强烈引用:

MySecondChildClass想要引用MyFirstClassMyChildClass对象。

所以我想我在这里也使用了一个弱指针,在MySecondChildClass

它有一个自定义初始化来设置它:

最后,有一个方法MySecondClass可以创建MySecondChildClass

这一切都正确吗?我有 90% 的把握这一切都很好,但我很困惑。

当我使用 时_firstClass.child,会创建一个指向它的强指针吗?我应该__weak在该方法调用中引用某处吗?在初始化期间怎么样MySecondChildClass?它在设置实例变量之前有一个临时指针,MyChildClass这是否会创建一个我应该担心的强指针?

任何澄清都会很棒。

0 投票
2 回答
258 浏览

ios - iOS 块。如何从块设置器中引用对象实例?

我有一个具有指向块的属性的对象:

我用一个块初始化属性。在blockI 中指的是对象实例:

但是,我收到有关保留循环的编译警告:

这样做的正确方法是什么?

谢谢,道格

0 投票
1 回答
215 浏览

objective-c - 排行榜请求、嵌套块和保留周期

我为我的 iPhone 游戏开发了一个排行榜显示类。该类具有以下实例方法。

如您所见,该方法复制排行榜请求,执行它,然后调用提供的完成处理程序。我的游戏中的一个图层调用这个方法如下。

当层和显示都被释放并且请求尚未完成时,我的游戏崩溃了。当请求完成时,它会尝试向已释放的实例发送消息,然后崩溃。是否可以取消排行榜请求?如果没有,有什么办法可以避免崩溃而不会导致内存泄漏?

0 投票
2 回答
1654 浏览

objective-c - Objective-C / Blocks - 这不是一个保留周期吗?

我认为这段代码创建了一个保留周期,因为块中的块在块中-longRunningTaskWithCompletion:捕获自我(设置字符串属性)并将块添加到调度队列属性中。

0 投票
1 回答
869 浏览

objective-c - 使用ARC在self.managedObjectContext上调用perfromBlock时保持循环?

在下面的代码中,我是否正确理解了保留周期问题,是否会有保留周期?

0 投票
1 回答
6425 浏览

ios - 如何修复“在此块中强烈捕获'块'可能会导致保留周期”

我正在处理这段代码,它在网络上执行一些冗长的异步操作,当它完成时会触发一个完成块,在该块中执行一些测试,如果变量获得某个值,另一个冗长的操作应该立即开始:

使用此代码,我从编译器收到此警告:

我变了:

在:

但我收到了另一个警告:

我怎样才能解决这个问题?

谢谢

尼古拉