 		if observers.containsObject(observer) == true {
 			observers.removeObject(observer)
 		}
+        if observers.count == 0 {
+            self.observers = NSHashTable.weakObjectsHashTable()
+        }
     }
 
     // MARK: - settings

	public var description: String {
		get {
			switch self {
			case Unknown:
				return "Unknown"
			case Walking:
				return "Walking"
			case Running:
				return "Running"
			case Automotive:
				return "Automotive"
			case Cycling:
				return "Cycling"
			}
		}
	}

    func startUpdating() {
        let status: LocationAuthorizationStatus = self.locationServicesStatus
        switch status {
            case .AllowedAlways, .AllowedWhenInUse:
                self.locationManager.startUpdatingLocation()
                self.locationManager.startMonitoringVisits()
                self.updatingLocation = true
                self.updateLocationManagerStateIfNeeded()
            default:
                break
        }
    }

    func stopUpdating() {
        let status: LocationAuthorizationStatus = self.locationServicesStatus
        switch status {
            case .AllowedAlways, .AllowedWhenInUse:
                self.locationManager.stopUpdatingLocation()
                self.locationManager.stopMonitoringVisits()
                self.updatingLocation = false
                self.updateLocationManagerStateIfNeeded()
            default:
                break
        }
    }
    
    func startLowPowerUpdating() {
        let status: LocationAuthorizationStatus = self.locationServicesStatus
        switch status {
            case .AllowedAlways, .AllowedWhenInUse:
                self.locationManager.startMonitoringSignificantLocationChanges()
                self.updatingLowPowerLocation = true
                self.updateLocationManagerStateIfNeeded()
            default:
                break
        }
    }

    func stopLowPowerUpdating() {
        let status: LocationAuthorizationStatus = self.locationServicesStatus
        switch status {
            case .AllowedAlways, .AllowedWhenInUse:
                self.locationManager.stopMonitoringSignificantLocationChanges()
                self.updatingLowPowerLocation = false
                self.updateLocationManagerStateIfNeeded()
            default:
                break
        }
    }
    
