类中的弱引用在第一个类的 init 中创建时返回 nil



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被销毁。这是预期的行为。如果您希望binit之后保留,则应将其保留为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
}

使用此代码,AB的引用仍然很弱,但由于B仍然存在于test()方法中,因此在调用printSomething()时也存在。

相关内容

  • 没有找到相关文章

最新更新