无法将weak应用于非类类型uiimageview。

8

我有一个在Swift中的类,需要对另一个类中分配的对象数组拥有弱指针。我已经

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

我收到的错误是

无法将“weak”应用于非类类型“[UIImageView]”

我也尝试了,但没有成功:

weak var avatars : [UIImageView?]?
3个回答

29

弱引用无法应用于非类类型:

这意味着您不能对任何值类型实例(例如Array,Dictionary,String等)进行弱引用,因为它们都是结构体而不是类。您只能给予类类型的弱引用(例如UIImage,UIImageView等)。在这种情况下,您试图给UIImageView Array添加弱引用,但我们知道数组是值类型,所以这是不可能的。

例如:

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

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

weak var imageView: UIImageView? //Correct

如果涉及协议: 如果我们只有一个结构类型的协议:

protocol SomeProtocol{
    func doSomething()  
}

我们无法将此类型的变量声明为弱变量:

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

但是,如果我们像这样将协议定义为类类型:

protocol SomeProtocol: class{
    func doSomething()
}
我们可以将此类型的变量声明为weak:
weak var delegate: SomeProtocol? //Correct

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

同样的原因:你只提供了一个类类型的弱引用。


你是救星。谢谢! - ekeith
如果我们将一个非类绑定协议作为 ViewController 的属性,会发生什么呢?我的意思是我们无法将其设置为 weak,那么它会创建保留循环吗? - Md. Sulayman

10
需要一个指向对象数组的弱指针。
好的,正如错误信息所告诉您的那样,您无法这样做。数组是一个结构体,而不是一个类。您不能有一个对结构体实例的弱引用;它是值类型,因此它不执行“weak”内存管理。
它也不需要-没有保留循环的危险,因为这是一个值类型。您应该问自己为什么认为它需要它。也许您认为“weak”和Optional总是一起使用,但它们并不总是如此。您已经声明了这是一个可选数组;这就足够了,不是吗?

2

您试图将weak应用于类型为UIImageViewArrayArray是一个结构体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接