我正在使用第三方库,它需要设置一个委托.在这种情况下,我想将委托设置为另一个类,所以我去写
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)
那我没有警告?这两个怎么样不一样?只是寻找建议和解释真的.谢谢!
实际上,它们是相同的.一旦someInstance超出范围,将释放委托处理程序,并且库的委托属性将变为nil.
在第一种情况下,编译器可以看到分配的结果被分配给weak属性并警告您它将立即释放,这可能不是您想要的.
在第二种情况下,它会看到对局部变量的赋值,因此对象将在内存中保留一段时间.编译器无法确定您不希望在函数末尾释放该对象,这意味着它不会警告您.
您需要在属性中存储对委托处理程序的强引用
| 归档时间: |
|
| 查看次数: |
1538 次 |
| 最近记录: |