【问题标题】:Does use of swift array automatically entangling use of NSArray?使用 swift 数组会自动纠缠 NSArray 的使用吗?
【发布时间】:2014-09-17 21:09:48
【问题描述】:

如果使用 swift 数组,NSArray 是否在幕后积极参与?

为了证明它似乎是,把它放在一个 SingleViewController 中:

var _board:[[Int]] = []
let numRows = 12
let numColumns = 11

func setupBoard() {
    for r in 0..<numRows {
        var boardRow:[Int] = []
        for c in 0..<numColumns {
            var one = 1
            boardRow.append(one)
        }
        _board.append(boardRow)
    }
}

func scramble() {
    let randomRow = Int(arc4random_uniform(UInt32(numRows)))
    let randomColumn = Int(arc4random_uniform(UInt32(numColumns)))
    let someValue = randomRow * numRows + randomColumn
    _board[randomRow][randomColumn] = someValue

}

然后在viewDidLoad中,

setupBoard()

let startTime = NSDate()

println("Start")
for i in 0...2000 {
    scramble()
}

let stopTime = NSDate();
let interval = stopTime.timeIntervalSinceDate(startTime)
println("Done took:  \(interval)")

在控制台中出现 Start 消息后,暂停执行。 这需要不止一次尝试,但会看到如下内容:

为什么?潜在的动机是确定为什么将值放入数组需要比预期更长的时间。

【问题讨论】:

    标签: arrays performance swift nsarray


    【解决方案1】:

    我猜是因为:

    • 这一切都发生在一个暴露给 Objective-C 的类中;即它继承自 NSObject,或者你在其上调用了@objc(我可以看到你确实有);和

    • 您正在使用 Int,可能发送到 Objective-C 但不能发送(您不能有整数的 NSArray,因为它们不是对象),并且因此将其转换为 NSNumber now 比以后更有意义。如果您扩展缺少的调用堆栈,您会看到正在转换为 NSNumber。这可能是这里效率低下的原因。

    在一个隔离类的 Array 中尝试同样的事情(私有,不从 NSObject 继承或暴露于 Objective-C)并使用不可桥接的元素类型(例如,您在 Swift 中定义的 Struct)。

    【讨论】:

    • !!重构示例以将数组移动到自己的简单 swift 类中。这改善了性能问题。然后我去了激发这个灵感的原始代码。重构它,将数组从基于 SKScene 的类移到它自己的 swift 类中。需要 9 秒的更新现在需要 0.06 秒!快 150 倍。而不是每帧的秒数,现在每秒获得帧数。谢谢。
    【解决方案2】:

    Swift 数组可以与 NSArray 互换。数组作为 Swift 数组使用时,按原样处理,如果需要是 NSArray,则按原样处理。

    但是,他们使用一种有效的方法在两种不同类型之间进行切换,这不会给您带来任何性能问题。

    您可以在Swift Interoperability In Depth Video 中听到 Apple 谈论他们如何来回转换。他们从大约 35:33 开始谈论它。

    【讨论】:

    • 谢谢。很有意思。纠缠是错误的术语。在幕后,一个 swift 数组确实有一个 swift 版本和一个 NSArray 版本。 matt 关于将数组移动到隔离类中的建议解决了性能问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2020-09-12
    • 2022-08-14
    相关资源
    最近更新 更多