疲弱的物业重新分配混乱

时间:2018-06-29 10:38:58

标签: ios swift xcode

我正在使用第三方库,它需要设置一个委托。在这种情况下,我想将委托设置为另一个类,所以我要写

ThirdPartyLibrary.delegate = MyDelegateHandlerClass()

但是Xcode(Xcode 10 beta)给了我一个警告:

  

由于属性“委托”,实例将被立即释放   是“弱”

点击进入第三方库的delegate,我发现它确实定义为weak,如下所示:

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

但是,如果我将委托的初始设置更改为:

let someInstance = MyDelegateHandlerClass()
ThirdPartyLibrary.delegate = someInstance

那我没有得到警告吗?这两个怎么不一样?只是在寻找建议和解释。谢谢!

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:0)

在第二种情况下,您不会收到任何警告,但也会被释放,因为someInstance是局部变量-当您离开声明它的作用域时,它将被释放。

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

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

    // class implementation
}

(...)

ThirdPartyLibrary.delegate = MyDelegateHandlerClass.sharedInstance