弱财产解除分配混乱

Mr.*_*r.P 1 xcode ios swift

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

ThirdPartyLibrary.delegate = MyDelegateHandlerClass()
Run Code Online (Sandbox Code Playgroud)

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

实例将立即解除分配,因为属性'委托'是'弱'

单击delegate第三方库,我看到它确实定义weak如下:

@property (weak, nonatomic) id<ThirdPartyLibraryDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

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

let someInstance = MyDelegateHandlerClass()
ThirdPartyLibrary.delegate = someInstance
Run Code Online (Sandbox Code Playgroud)

那我没有警告?这两个怎么样不一样?只是寻找建议和解释真的.谢谢!

Pau*_*w11 5

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

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

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

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