清理非UIViewControllers中的委托

时间:2015-05-13 04:02:13

标签: ios swift

我一直在尝试与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”消息被打印出来。

因此,如果我需要清理代理,我该如何清理它?感谢。

2 个答案:

答案 0 :(得分:0)

如果您使用单独的对象作为委托,则可以从视图控制器内部对其进行强引用。但是,委托本身不应该强烈引用该视图或它所委托的任何对象。

在上面的示例中,TestViewController应该包含managerlocationLogic作为其属性。然后,您可以在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

无主属性,所以很安全。它不会导致循环引用。

所以,你不需要清理它。