【问题标题】:Scope of an object, objective-c, CLLocationManager对象的范围,objective-c,CLLocationManager
【发布时间】:2011-04-29 20:40:55
【问题描述】:

我对编程还是很陌生,所以我有一个菜鸟问题。当您在我的 appDelegate.m 文件中有一个实例变量时,在我的 CLLocationManager 类型的情况下,我想我可以在 applicationDidFinishLaunching 方法中分配和初始化我的 CLLocationManager 实例变量。然后我可以使用一个按钮以不同的方法启动UpdatingLocation(因为我是从另一个类调用它)。这似乎不起作用,我认为我需要使用与 startUpdatingLocation 相同的方法来分配/初始化。真的吗?我是否需要以相同的方法停止更新位置?我的代码如下:

(locationManager is declared as a property)


- (void)stopUpdating {
    [locationManager stopUpdatingLocation];
}

- (double)distanceTraveled {
    return distanceTraveled;
}

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // Override point for customization after application launch
    [window addSubview:rootController.view];    
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [window makeKeyAndVisible];
}

- (void)startUpdating {
    [locationManager startUpdatingLocation];
}

看来我应该这样做更像:

- (void)startUpdating {
locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
}

如果我应该这样做第二种方式,是因为 CLLocationManager 对象的范围仅适用于它所在的方法吗?我认为将它作为实例变量可以在其他方法中使用它,并且我可以为 startUpdatingLocation 和 stopUpdatingLocation 提供单独的方法。谢谢。

【问题讨论】:

  • 不要过多地贬低您的问题,但请理解应用程序委托不应用于此类事情。将此添加到最有意义的控制器中(即,取决于您的层次结构,也许将它放在您的根视图控制器中是有意义的)。应用程序委托有一个有限的目的:设置您的应用程序,并仅处理特定事件。你的工作是在其他地方完成其余的工作。
  • 好的。我想我认为 appDelegate 的一部分是设置你的应用程序,比如打开 GPS,但我明白你的意思。会改的。

标签: objective-c cllocationmanager


【解决方案1】:

你最初认为是正确的。如果您有一个实例变量,则该变量在对象的整个生命周期内都对您可用(在本例中为您的应用委托)。

如果您正在做的事情不起作用,那是因为其他一些问题。您无需在每次调用 startUpdating 时分配新的 CLLocationManager。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多