Swift包装类

时间:2015-09-04 18:30:27

标签: swift class wrapper swift2

我之前正在观看关于快速优化的讨论,他们正在使用一个包含5个变量3个字符串,一个数组和一个字典的结构示例。他们说要降低你的引用数,你可以使用包装类。有人可以做一个虚拟的我可能能够更好地理解它。

1 个答案:

答案 0 :(得分:2)

如果结构具有许多属性作为引用类型的性能问题,则将使用包装器类。

通用包装类:

class Wrapper<T> {
    var value: T // or "let" instead of "var"
    init(_ value: T) { self.value = value }
}

这是因为如果将它分配给另一个变量,则会复制属性的所有指针,因此所有引用计数(请参阅ARC)都会递增(并在结尾处递减)。

这个问题主要发生在循环遍历此类结构的大型数组时,每次迭代都会创建一个新变量。

使用包装器类时,其引用计数会递增和递减一次。

示例:

struct Big {
    // "n" properties which have reference semantics
    ...
    ...
}

// "m" count
let hugeArray = [Big(), Big(), Big(), ...]

// m * n reference count operations (+1, -1)
for element in hugeArray {
    // do something
}

// if huge array is of type [Wrapper<Big>]
// m * 1 reference count operations (+1, -1)
for element in hugeArray {
    // do something
}

旁注:这样的类可以提高性能。如果你写它,分配它或将它作为参数传递它,请小心使用它,因为它“改变”你的包装类型的语义而且没有值类型。