我正在使用第三方库,它需要设置一个委托。在这种情况下,我想将委托设置为另一个类,所以我要写
ThirdPartyLibrary.delegate = MyDelegateHandlerClass()
但是Xcode(Xcode 10 beta)给了我一个警告:
由于属性“委托”,实例将被立即释放 是“弱”
点击进入第三方库的delegate
,我发现它确实定义为weak
,如下所示:
@property (weak, nonatomic) id<ThirdPartyLibraryDelegate> delegate;
但是,如果我将委托的初始设置更改为:
let someInstance = MyDelegateHandlerClass()
ThirdPartyLibrary.delegate = someInstance
那我没有得到警告吗?这两个怎么不一样?只是在寻找建议和解释。谢谢!
答案 0 :(得分:5)
实际上,它们是同一件事。一旦someInstance
超出范围,委托处理程序将被释放,并且库的委托属性将变为nil
。
在第一种情况下,编译器可以看到分配结果已分配给weak
属性,并警告您将立即释放该结果,这可能不是您想要的。
在第二种情况下,它会看到对局部变量的分配,因此该对象将在内存中保留一段时间。编译器无法确定您不希望在函数末尾释放该对象,这意味着它不会发出警告。
您将需要在属性中存储对委托处理程序的强引用
答案 1 :(得分:0)
在第二种情况下,您不会收到任何警告,但也会被释放,因为someInstance
是局部变量-当您离开声明它的作用域时,它将被释放。
您需要做的是将MyDelegateHandlerClass
实例存储在某个地方。如果确定只使用MyDelegateHandlerClass
的一个实例,则可以使用Singleton模式:
class MyDelegateHandlerClass : ThirdPartyLibraryDelegate
{
static let sharedInstance = MyDelegateHandlerClass()
// class implementation
}
(...)
ThirdPartyLibrary.delegate = MyDelegateHandlerClass.sharedInstance