我一直在尝试与iOS/Swift
代码的传统示例不同的东西。通常我会看到在UIViewController
子类中处理委托方法。我想要尝试的是将一些业务逻辑从视图控制器中保留在它自己的逻辑类中,UIViewController
将使用它。例如:
class LocationLogic : NSObject {
let manager = CLLocationManager()
var locationLogicDelegate: LocationLogicDelegate?
override init() {
super.init()
manager.delegate = self
}
func checkWhenInUseLocationServices() {
if CLLocationManager.authorizationStatus() == .NotDetermined {
manager.requestWhenInUseAuthorization()
}
}
func startUpdatingLocation() {
manager.startUpdatingHeading()
}
func stopUpdatingLocation() {
manager.stopUpdatingLocation()
}
deinit {
println("deinit LocationLogic")
manager.delegate = nil
}
}
在LocationLogic的init()方法中,我将其类设置为委托。我的第一个问题是,我是否需要稍后清理代表?我记得读过循环引用,但不确定是否适用。如果是这样,我该如何清理它?我尝试在deinit闭包中清理它,但奇怪的是,在UIViewController
class TestViewController: UIViewController {
var locationLogic = LocationLogic()
}
locationLogic是TestViewController
上的一个属性,当TestViewController
被推入堆栈时,我立即看到我的“deinit LocationLogic”消息被打印出来。
因此,如果我需要清理代理,我该如何清理它?感谢。
答案 0 :(得分:0)
如果您使用单独的对象作为委托,则可以从视图控制器内部对其进行强引用。但是,委托本身不应该强烈引用该视图或它所委托的任何对象。
在上面的示例中,TestViewController
应该包含manager
和locationLogic
作为其属性。然后,您可以在TestViewController中执行类似的操作:
self.manager.delegate = self.locationLogic
您在CLLocationManager
内不需要LocationLogic
对象,因为iOS在调用时会将位置管理器对象传递给CLLocationManagerDelegate
个函数。
答案 1 :(得分:0)
如果您查看该文档,您会发现
这是// The user is responsible for releasing the returned object pointer by calling obj->Release();
IMessage* MessageCreate(int param)
{
return new(std::nothrow) Message(param);
}
属性
IMessage
无主属性,所以很安全。它不会导致循环引用。
所以,你不需要清理它。