Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 弱属性解除分配混乱_Ios_Swift_Xcode - Fatal编程技术网

Ios 弱属性解除分配混乱

Ios 弱属性解除分配混乱,ios,swift,xcode,Ios,Swift,Xcode,我正在使用第三方库,需要设置一个委托。在这个场景中,我想将委托设置为另一个类,因此我开始编写 ThirdPartyLibrary.delegate = MyDelegateHandlerClass() 但是Xcode(Xcode 10 beta版)给了我一个警告: 实例将立即解除分配,因为属性“委托” 是‘弱’ 点击第三方库的委托,我看到它确实被定义为弱,如下所示: @property (weak, nonatomic) id<ThirdPartyLibraryDelegate>

我正在使用第三方库,需要设置一个委托。在这个场景中,我想将委托设置为另一个类,因此我开始编写

ThirdPartyLibrary.delegate = MyDelegateHandlerClass()
但是Xcode(Xcode 10 beta版)给了我一个警告:

实例将立即解除分配,因为属性“委托” 是‘弱’

点击第三方库的
委托
,我看到它确实被定义为
,如下所示:

@property (weak, nonatomic) id<ThirdPartyLibraryDelegate> delegate;

那么我没有得到任何警告?这两个怎么会不一样呢?只是想寻求建议和解释。谢谢

在第二种情况下,您不会得到警告,但它也会被释放,因为
someInstance
是一个局部变量,当您离开声明它的范围时,它将被释放

您需要做的是将您的
MyDelegateHandlerClass
实例存储在某个地方。如果确定只使用一个
MyDelegateHandlerClass
实例,则可以使用单例模式:

class MyDelegateHandlerClass : ThirdPartyLibraryDelegate
{
    static let sharedInstance = MyDelegateHandlerClass()

    // class implementation
}

(...)

ThirdPartyLibrary.delegate = MyDelegateHandlerClass.sharedInstance

在第二种情况下,您不会得到警告,但它也会被释放,因为
someInstance
是一个局部变量,当您离开声明它的范围时,它将被释放

您需要做的是将您的
MyDelegateHandlerClass
实例存储在某个地方。如果确定只使用一个
MyDelegateHandlerClass
实例,则可以使用单例模式:

class MyDelegateHandlerClass : ThirdPartyLibraryDelegate
{
    static let sharedInstance = MyDelegateHandlerClass()

    // class implementation
}

(...)

ThirdPartyLibrary.delegate = MyDelegateHandlerClass.sharedInstance

实际上,它们是同一件事。一旦
someInstance
超出范围,将释放委托处理程序,库的委托属性将变为
nil

在第一种情况下,编译器可以看到分配的结果被分配给
属性,并警告您它将立即被释放,这可能不是您想要的

在第二种情况下,它看到对局部变量的赋值,因此对象将在内存中保留一段时间。编译器无法确定您不希望在函数末尾释放对象,这意味着它不会警告您


您需要在属性中存储对委托处理程序的强引用,实际上,它们是相同的。一旦
someInstance
超出范围,将释放委托处理程序,库的委托属性将变为
nil

在第一种情况下,编译器可以看到分配的结果被分配给
属性,并警告您它将立即被释放,这可能不是您想要的

在第二种情况下,它看到对局部变量的赋值,因此对象将在内存中保留一段时间。编译器无法确定您不希望在函数末尾释放对象,这意味着它不会警告您


您需要在属性中存储对委托处理程序的强引用

Ah!现在让我们假设所有这些都在一个结构中进行,在结构的顶部,我可以声明
private static让someInstance=MyDelegateHandlerClass()
,然后将其分配给
委托
,这样就可以了吗?啊,这很有意义!现在让我们假设所有这些都在一个结构中进行,在结构的顶部,我可以声明
private static let someInstance=MyDelegateHandlerClass()
,然后将其分配给
委托
,这样就可以了吗?对于任何感兴趣的人,这个警告最近在中实现:)对于任何感兴趣的人,此警告最近在中实现:)