im试图在另一个类中创建弱引用类,在第一个类的init中,我创建第二个类的实例以在函数中使用它,但在init函数完成后,第二个类被销毁并返回nil,这是一个示例代码
//: Playground - noun: a place where people can play
import UIKit
class A {
weak var b : B?
init(){
NSLog("a Created")
self.b = B()
}
deinit{
NSLog("a Destroyed")
}
}
class B {
var arrayOfA : Array <A> = []
init(){
NSLog("b Created")
}
deinit{
NSLog("b Destroyed")
}
func printSomething(){
NSLog("print Something")
}
}
func test(){
let a : A = A()
a.b?.printSomething()
NSLog("still in test()")
}
test()
在控制台中,我看到了这个
2016-04-04 00:34:50.516 MyPlayground〔20009:921709〕创建
2016-04-04 00:34:50.516 MyPlayground[20009:921709]b创建
2016-04-04 00:34:50.516我的游乐场[20009:921709]b摧毁
2016-04-04 00:34:50.527我的游乐场[20009:921709]仍在测试中()
2016-04-04 00:34:50.527我的游乐场[20009:921709]一架被摧毁的
调用printSomething()将返回零
我不想在A类之外创建B类,也希望它对于内存泄漏问题很弱。
我想要两个swift类之间的一对多关系,这样我就可以从函数
由于您将b
声明为weak
,一旦超出范围,它就会被释放。在这种情况下,只要这个代码:
init(){
NSLog("a Created")
self.b = B()
}
执行完毕,self.b
被销毁。这是预期的行为。如果您希望b
在init
之后保留,则应将其保留为strong
。
或者你可以这样做:
func test(){
let b : B = B()
let a : A = A(b:b)
a.b?.printSomething()
NSLog("still in test()")
}
在A
中,您可以制作一个特殊的init
,用于接收B
:
init(b: B){
NSLog("a Created")
self.b = b
}
使用此代码,A
对B
的引用仍然很弱,但由于B
仍然存在于test()
方法中,因此在调用printSomething()
时也存在。