- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
此 SpriteKit Action 通过使用完成闭包调用自身来重复。它使用闭包,而不是 SKAction.repeatActionForever()
,因为它需要在每次重复时生成一个随机变量:
class Twinkler: SKSpriteNode {
init() {
super.init(texture:nil, color:UIColor.whiteColor(), size:CGSize(width:10.0, height:10.0))
twinkle()
}
func twinkle() {
let rand0to1 = CGFloat(arc4random()) / CGFloat(UINT32_MAX)
let action = SKAction.fadeAlphaTo(rand0to1, duration:0.1)
let closure = {self.twinkle()}
runAction(action, completion:closure)
}
}
我想我应该使用 [unowned self]
来避免闭包的强引用循环。当我这样做时:
let closure = {[unowned self] in self.twinkle()}
它因错误而崩溃:_swift_abortRetainUnowned
。但是如果我改用[weak self]
:
let closure = {[weak self] in self!.twinkle()}
它执行无误。为什么 [weak self]
可以工作,但 [unowned self]
会崩溃?我什至应该在这里使用其中任何一个吗?
Twinkler
对象在程序的其他地方被强引用,作为另一个节点的子节点。所以我不明白 [unowned self]
引用是如何被破坏的。它不应该被释放。
我尝试使用 dispatch_after()
在 SpriteKit 之外复制这个问题,但我做不到。
最佳答案
如果 self 在闭包中可以为 nil,则使用 [weak self]。
如果 self 在闭包中永远不会为 nil,则使用 [unowned self]。
如果在您使用 [unowned self] 时崩溃,那么 self 在该闭包的某个时刻可能为 nil,因此您需要使用 [weak self] 代替。
文档中的示例非常适合阐明在闭包中使用strong、weak 和unowned:
https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html
关于closures - 为什么 [weak self] 有效但 [unowned self] 在 Swift 闭包中中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24414998/
我正在阅读为 STM32 定义中断 vector 的代码 here .出于某种原因,同时使用了 __attribute__((weak)) 和 #pragma weak: void __attribu
Vala 中的弱引用和无主引用有什么区别。 根据我从 Vala 教程中学到的知识,弱引用和无主引用都不算在内,当真实实例超出范围时,它们将引用 null(!!)。 为什么出于一个原因应该有两种不同的方
正如我们所知,在 block 中使用 strong self 会导致循环保留和内存泄漏。通常的做法是在 block 中使用弱 self ,还是将弱 self 分配给 block 中的 strong s
所以我正在尝试对我用 swift 编写的代码进行一些润色和分析。我有一堆问题很详细,通过搜索弱引用和强引用等主题很难找到它们。 例如,我没有看到 XCode 提示下面用于 socket 的任何一行。如
为什么weak.lock()返回 nullptr在此代码片段中: std::weak_ptr weakPtr1 = std::make_shared(6); std::cout shar
创建了一个模板函数C++ template void myswap(T&d,T&s) 。Main 将其用于 int、double、complex 类型。使用 g++ 编译源代码。通过 nm 转储符号
什么时候不应该鼓励弱类型?大型项目中不鼓励使用弱类型吗?如果左侧像下面这样强烈键入,那将是该规则的例外吗? int i = 5 string sz = i sz = sz + "1"
在接下来的 0.5 秒延迟期间,tableViewManager 可能会被释放。我想确保在嵌套闭包内与 textView 交互时 textView 是弱的。我该怎么做? tableViewManage
动机 我有 2 个静态库,libStatic1.a 和 libStatic2.a。此外,我还有许多使用 libStatic1.a 编译的 SO(共享对象)。至此,libStatic1.a 和 libS
让我们调用一些函数,它有一个转义闭包作为参数: someFunc(complition: { self.someAnotherFunc() }) 相当于: someFunc(complitio
我想通过使用聚合来构建一个包含多个子对象的类TParent。有些对象是独立的,而有些对象也可能依赖于其他子对象。所有子对象都必须有对父对象的引用。我还想尽可能使用接口(interface)。 为此,我
我正在编写一个需要 SQL Server SMO 库的 .NET 工具。我不在乎它是来自 Server 2005 (9.0)、2008 (10.0) 还是 2008 R2(可能是 10.5,没有检查)
所以我最近一直在考虑一些自动内存管理的想法——特别是,我一直在考虑实现一个基于引用计数的内存管理器。当然,每个人都知道循环引用会扼杀幼稚的引用计数。解决方案:弱引用。就我个人而言,我讨厌以这种方式使用
我知道,在非引用类型数据上使用 weak 时,这会引发错误。但是,我在我自己创建的类上使用它。只是想知道是否有人遇到同样的问题。 internal static func registeruUser(
我有一个名为 Panel 的类,它包含这样一个弱属性: @property (nonatomic, weak) Dialog *container; 在 Instruments 中,我可以看到 set
这个问题与this post非常相似- 但不完全是 我在 .csv 文件中有一些数据。数据精确到第 4 位 (#.####)。 在 Excel 或 SAS 中计算平均值给出的结果精确到第 5 位 (#
我正在编写一个名为“MQTT_interface”的类。我需要在此类的“重新连接”方法中使用“回调”功能。我想开发人员会为自己编写函数“回调”,如果没有,将会有一种同名的弱函数(“回调”),它会向控制
在 Java 中,如果内存不足,弱引用将被垃圾回收。在 Linux 中,malloc() 总是返回一个强引用,即。在调用者调用 free() 函数之前,指针永远不会被释放。 我想分配一个缓冲区用于缓存
我可能对 weak 理解有误: 我的情况: 具有一些弱回调的“物理层” 实现这些回调的“框架层”,并为应用层提供新的 WEAK 回调 主要 - 应用层。 phy.h #pragma once void
我很想知道是否有一种方法可以在 Linux、OS X 或 Windows 等常见操作系统的用户空间中分配“弱”内存(标准接口(interface)显然不可能)。我的意思是那种 mmap(),如果操作系
我是一名优秀的程序员,十分优秀!