

CLLocationManagerを使って、delegateを使って通知を受ける際に、なぜプロパティとして、  
CLLocationManager型のプロパティを持たなければいけないのでしょうか？

[code]

    class LocationService: NSObject {
        private let locationManager = CLLocationManager()
        private var tag = ""
    
        override init() {
            super.init()
            locationManager.delegate = self
        }
    
        convenience init(tag: String) {
            self.init()
            self.tag = tag
        }
    
        func startUpdating() {
            print("tag:\(tag) startUpdating")
            locationManager.startUpdatingLocation()
        }
    
        func stopUpdating() {
            print("tag:\(tag) stopUpdating")
            locationManager.stopUpdatingLocation()
        }
    
        func checkPermisson() {
            switch CLLocationManager.authorizationStatus() {
            case .notDetermined:
                print("notDetermined")
            case .restricted:
                print("restricted")
            case .denied:
                print("denied")
            case .authorizedAlways:
                print("authorizedAlways")
            case .authorizedWhenInUse:
                print("authorizedWhenInUse")
            }
        }
    }
    
    extension LocationService: CLLocationManagerDelegate {
    
        //  このメソッドは locationManager.delegate = self を実行したタイミングでまず1回呼ばれる
        func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
            print("tag:\(tag) didChangeAuthorization -> ", status.rawValue)
            if status == .notDetermined {
                locationManager.requestWhenInUseAuthorization()
            }
        }
    
        func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
            if let location = locations.last {
                let latitude = location.coordinate.latitude
                let longitude = location.coordinate.longitude
                let timestamp = location.timestamp.description
                print("tag:\(tag) didUpdateLocations -> latitude:\(latitude) longitude:\(longitude) timestamp:\(timestamp)")
            }
        }
    
        func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
            print("tag:\(tag) didFailWithError -> ", error)
        }
    }
    
[/code]

自分として、以下のように書いてもいい気もしますが、

[code]

    override init() {
            super.init()
            let locationManager = CLLocationManager()
            locationManager.delegate = self
        }
    
[/code]

様々な資料を読んでも全てプロパティにセットしてあります。  
分かる方いましたら、ご教授お願い致します。


CC BY-SA 4.0
2021-07-04T05:29:11.640
77953
2021-07-04T06:47:50.353
2021-07-04T06:47:50.353
3060
47147
question
swift delegate
CLLocationManagerの使い方について


下の書き方では、`init`が終了した時に`locationManager`のインスタンスが解放され、`delegate`に`self`を保持した`locationManager`のインスタンスが無くなってしまうからです。

プロパティにすると言うことは、そのクラスのインスタンスが存在する間、プロパティが破棄されないことの保証になります。

しかし、インスタンスを`init`の中のローカル変数にしてしまうと、`init`が終了した際にローカル変数は破棄されますので、`locationManager`（特に`delegate`に自身を保持した）がどこにも無くなってしまうからです。


CC BY-SA 4.0
2021-07-04T05:53:25.617
77955
2021-07-04T05:53:25.617
14745
77953
answer