【问题标题】:weak cannot be applied to non-class type uiimageviewweak 不能应用于非类类型的 uiimageview
【发布时间】:2015-07-26 19:23:42
【问题描述】:

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

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

我得到的错误是

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

我也试过了,没用:

weak var avatars : [UIImageView?]?

【问题讨论】:

    标签: swift weak-references


    【解决方案1】:

    Weak 不能应用于非类类型:

    这意味着你不能对任何值类型实例(例如数组、字典、字符串等)进行弱引用,因为这些都是结构而不是类。您只提供类类型的弱引用(例如 UIImage、UIImageView 等)。在这种情况下,您试图对 UIImageView 数组提供弱引用,我们知道数组是一种值类型,所以这是不可能的。

    例如:

    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 var delegate: SomeProtocol? //Correct
    

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

    同样的原因:你只给出类类型的弱引用

    【讨论】:

    • 你是救世主。谢谢
    • 如果我们使用非类绑定协议作为 ViewController 的属性会怎样?我的意思是我们不能让它变弱,所以它会创建保留循环吗??
    【解决方案2】:

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

    好吧,正如错误消息告诉你的那样,你不能。数组是一个结构,而不是一个类。您不能对结构实例进行弱引用;它是一个值类型,所以它不做weak 内存管理。

    它也不需要它——没有保留循环的危险,因为这是一种值类型。你应该问自己为什么你认为它确实需要它。也许你认为weak 和 Optional 总是在一起的,但他们没有。您已经将其声明为可选数组;肯定够了。

    【讨论】:

      【解决方案3】:

      您正在尝试将weak 应用于UIImageView 类型的ArrayArray 是一个结构体。

      【讨论】:

        猜你喜欢
        • 2016-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多