weak不能应用于非类型的uiimageview

时间:2015-05-15 00:53:34

标签: swift weak-references

我在swift中有一个类,它需要一个指向另一个类中分配的对象数组的弱指针。我有

class myView: UIView
{
    var lines:[CAShapeLayer] = []
    weak var avatars : [UIImageView]?

我得到的错误是

  

'弱'不能应用于非类型的类型' [UIImageView]'

我也试着无济于事:

weak var avatars : [UIImageView?]?

3 个答案:

答案 0 :(得分:27)

弱无法应用于非类类型:

这意味着您不能对任何值类型实例(例如,Array,Dictionary,String等等)进行弱引用,因为这些都是struct而不是class。你只给出了类型的弱引用(例如UIImage,UIImageView等)。在这种情况下,你试图给UIImageView数组提供弱引用,我们知道数组是一个值类型,所以它是不可能的。

例如:

weak var str: String? //CompileTime Error(Wrong)

weak var arr: Array? //CompileTime Error(Wrong)

weak var imageView: UIImageView? //Correct

如果是议定书: 如果我们只有一个struct类型的协议:

protocol SomeProtocol{
    func doSomething()  
}

我们不能将此类型的变量声明为弱:

weak var delegate: SomeProtocol? //CompileTime Error(Wrong)

但是如果我们这样制作类型的协议:

protocol SomeProtocol: class{
    func doSomething()
}

我们可以将此类型的变量声明为弱:

weak var delegate: SomeProtocol? //Correct

我认为你很容易理解,为什么会在协议中发生这种情况?

同样的原因:你只给出了类型

的弱引用

答案 1 :(得分:9)

  

需要有一个指向对象数组的弱指针

好吧,正如错误消息告诉你的那样,你不能。 Array是一个结构,而不是一个类。您不能对结构实例有弱引用;它是一个值类型,因此它不执行weak内存管理。

也不需要它 - 没有保留周期的危险,因为这是一种值类型。你应该问问自己为什么你认为它确实需要它。也许你认为weak和Optional总是在一起,但他们没有。你已经宣布这是一个Optional数组;这肯定是足够的。

答案 2 :(得分:2)

您正尝试将weak应用于Array类型UIImageViewArray是一个结构。