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()
,然后将其分配给委托
,这样就可以了吗?对于任何感兴趣的人,这个警告最近在中实现:)对于任何感兴趣的人,此警告最近在中实现:)