问题标签 [strong-references]

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 回答
1272 浏览

ios - iOS 关闭视图控制器不会释放内存

我知道在父视图中显示 viewController 时,这都是弱强引用...如果我错了,请纠正我

这是我如何做的一个例子

仅从打开状态查看我的内存监视器并一遍又一遍地关闭相同的视图

在此处输入图像描述 我试过这个

但这会让我崩溃

并以这种方式关闭 viewClass(内部关闭)

任何帮助将不胜感激谢谢

0 投票
1 回答
192 浏览

swift - 关于应该把[无主的自我]放在哪里的困惑

我有一个保留的循环,所以我的视图控制器的 deinit 不会被调用,我正在尝试通过添加 [unowned self] 来解决这个问题,但我不太确定在我的案例中将 unowned 放在哪里:

情况1

案例2

我很好奇这两种情况之间有什么区别以及为什么一种有效而另一种无效

0 投票
1 回答
880 浏览

swift - Property Initialization with closures

I was looking into ARC and strong reference cycles and ran into this code of mine:

reference to self in the addTarget method inside the closure doesn't seem to create a strong reference cycle.

Can someone explain why?

Also, I noticed that if I remove inheritance from UIView the compiler starts complaining: Use of unresolved identifier 'self'.

Can someone explain this as well, why does it happen in this case and doesn't in the first one?

0 投票
1 回答
692 浏览

objective-c - 在 dispatch_async 队列中的 weakself(dispatch_get_main_queue(), ^{})

下面的代码片段在目标 C中

  1. weakSelf因为它在主队列中,所以总是可用/有效吗?
  2. 我们是否只需要strongSelf在块不是主队列时才需要声明?
0 投票
1 回答
1213 浏览

swift - ARC 是否对无主引用进行计数?

ARC 是否保留对对象的无主引用计数?

那么,如果一个对象的强引用计数达到 0 并且该对象的无主引用计数 > 0,则该对象被取消初始化但没有被取消分配?只有当强引用计数和无主引用计数达到 0 时,它才会被解除分配?

我在一篇文章中读到过,我认为是在 Medium 上),但我不确定它是否正确。

0 投票
1 回答
282 浏览

xcode - Xcode 内存图是否为非内存周期的强引用提供任何智能视觉指标?

作为我之前的后续工作,如何使用 dispatchQueues 创建参考周期?

对于强引用(创建泄漏,但不是引用循环),例如Timer, DispatchSourceTimer, DispatchWorkItem,内存图不会创建紫色图标,我怀疑这仅仅是因为它没有找到两个强烈指向彼此的对象。

我知道我可以来回观察一个特定的类并没有离开内存,但想知道 Xcode 是否提供了更多。

  • 还有其他指标吗?
  • 我知道 Xcode 直观地显示了内存中类型的实例数。但是有没有办法过滤内存中超过 3 个实例的对象?
0 投票
1 回答
235 浏览

swift - 深入了解 Swift 中的弱引用和无主引用

我想完全理解 Swift 中弱引用和无主引用的内容。为此,我阅读了MikeAsh并得到了一些问题。

已知的:

  1. 当没有(我想是unowned)对象引用时,强引用计数器直接存储在对象的内存区域中
  2. 当出现链接时,对象内存中的第二个单词被重用于引用边表
  3. 边桌有指向对象的链接
  4. 薄弱环节指的是这个边桌

我想澄清的是:

  1. 除了指向对象的链接和强引用的数量之外,还有什么边表存储在里面?
  2. 无主参考链接也指向边桌吗?如果不是,无主链接指的是对象内存,无主之间的性能如何?
0 投票
1 回答
597 浏览

swift - Swift 弱引用比强引用慢得多

我正在用 Swift 构建一个物理引擎。在最近对引擎进行了一些添加并运行了基准测试之后,我注意到性能大大降低了。例如,在下面的屏幕截图中,您可以看到 FPS 如何从 60 FPS 下降到 3 FPS(FPS 在右下角)。最终,我将问题追溯到一行代码:

在我的补充中,我添加了一个从Shape类到Body类的弱引用。这是为了防止强引用循环,因为Body也有强引用Shape.

不幸的是,弱引用似乎有很大的开销(我想将它归零的额外步骤)。我决定通过构建下面的物理引擎的大规模简化版本并对不同的参考类型进行基准测试来进一步研究这一点。



结果

以下是每种参考类型的基准时间。在每次测试中,body对类的引用都发生了Shape变化。该代码是使用发布模式 [-O] 和面向 macOS 10.15 的 Swift 5.1 构建的。

weak var body: Body!: 0.1886 秒

var body: Body!: 0.0167 秒

unowned body: Body!: 0.0942 秒

您可以看到在上面的计算中使用强引用而不是弱引用会导致性能提高 10 倍以上。使用unowned帮助,但不幸的是它仍然慢了 5 倍。通过分析器运行代码时,似乎执行了额外的运行时检查,从而导致大量开销。

所以问题是,我有什么选择可以让一个简单的反向指针指向 Body 而不会产生这个 ARC 开销。此外,为什么这种开销看起来如此极端?我想我可以保持强参考周期并手动打破它。但我想知道是否有更好的选择?

更新: 根据答案,结果
unowned(unsafe) var body: Body!如下:0.0160 s

Update2: 从 Swift 5.2 (Xcode 11.4) 开始,我注意到 unowned(unsafe) 的开销要大得多。这是现在的结果 unowned(unsafe) var body: Body!:0.0804 s

注意:从 Xcode 12/Swift 5.3 开始仍然如此

0 投票
1 回答
130 浏览

swift - Swift:动态创建和分配委托

MKMapView 的委托属性在 swift 中是这样定义的:

如果我必须为长度/计数事先未知的数组中的每个项目动态创建地图视图,我如何动态地为每个地图分配一个唯一的委托实例而不为每个委托保留一个类变量(因为我们不知道数组中的项目数)。有没有类似于 Obj-C 的东西__Strong

更新:我可以有一个类数组,我可以向其中添加每个委托,但是,如果 Swift 中有这样的东西,是否还有其他方法,例如通过使用 __Strong 更内联

0 投票
2 回答
257 浏览

swift - NotifcationCenter 导致强引用循环 - Swift 5

使用通知中心时,我似乎得到了一个强参考周期。

我正在使用 NotificationCenter 来观察设备的旋转。(虽然有些人认为这不是确定设备旋转的最佳方式,但目前这似乎是我唯一的途径,因为没有使用自动布局,也没有使用情节提要)。

deinit {}ViewController即使我删除了 and 中的观察者,viewWillDisappear也永远不会在 my 中调用viewDidDisappear

关于为什么会发生这种情况以及如何解决它的任何想法?

也欢迎任何关于如何确定旋转检测的新想法(虽然没有使用自动布局或情节提要)。

要达到TestVC()self.navigationController?.pushViewController(TestVC(), animated: true)在以前使用过ViewController并返回我使用pop.

没有Observer现在,班级将正确deinit

解决

由于下面标记的答案,强参考循环被删除。

只需更换NotificationCenter.default.addObserver(forName: UIDevice.orientationDidChangeNotification, object: nil, queue: .main, using: rotationDetected)

NotificationCenter.default.addObserver(self, selector: #selector(rotationDetected), name: UIDevice.orientationDidChangeNotification, object: nil)