我想尝试检测我的应用程序中的传入电话。我从头开始创建了一个新的Swift项目,只是为了尝试一些代码。我所做的唯一一件事就是在每个新项目创建的ViewController中导入CoreTelephony,而且我还将viewDidLoad()更改为:
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let callCenter = CTCallCenter()
NSLog("start")
callCenter.callEventHandler = {[weak self] (call: CTCall) -> () in
self?.label.text = call.callState
NSLog("Call state")
NSLog(call.callState)
}
我也没有[弱自我]尝试过,因为我是新手,并不知道这意味着什么。
当我通过手机上的XCode运行我的新小应用程序时,接到调用,断开连接或其他任何事情都不会发生。没错,曾经如此。为了使用CoreTelephony框架和CTCallCenter,我是否还需要做更多的事情?
问候
约翰
最佳答案
这是我上面评论的扩展。
当您在方法中定义变量时,该变量及其值仅存在于该方法中。该方法完成运行后,将清除有值(value)的值及其值,以便它们不会继续使用内存(除非该值已在其他地方使用)。
在您的情况下,您定义callCenter
并为其分配一个新的CTCallCenter
实例。但是在viewDidLoad
末尾,不再使用CTCallCenter
实例,因此可以从内存中清除它。由于它不再存在,因此无法处理通话事件。
通过将callCenter
添加为 View Controller 的属性,它将CTCallCenter
实例的生命周期与 View Controller 的生命周期联系在一起。因此,仅当从内存中清除 View Controller 时,才会从内存中清除CTCallCenter
。
有关更多详细信息,请阅读Automatic Reference Counting in Swift