Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 对象的范围、目标c、CLLocationManager_Objective C_Cllocationmanager - Fatal编程技术网

Objective c 对象的范围、目标c、CLLocationManager

Objective c 对象的范围、目标c、CLLocationManager,objective-c,cllocationmanager,Objective C,Cllocationmanager,我还是一个编程新手,所以我有一个问题。当您在appDelegate.m文件中有一个实例变量(在我的示例中是CLLocationManager类型)时,我认为可以在ApplicationIDFinishLaunching方法中分配和初始化我的CLLocationManager实例变量。然后我可以使用一个按钮以不同的方法启动DatingLocation(因为我是从另一个类调用它)。这似乎不起作用,我想我需要使用与startUpdatingLocation相同的方法alloc/init。这是真的吗?我

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

(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和StopUpdateLocation提供一个单独的方法。谢谢。

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


如果你所做的不起作用,那是因为其他问题。您无需在每次致电startUpdating时分配新的CLLocationManager。

不要过多地回避您的问题,但请理解,应用程序委托不应用于此类事情。将其添加到最有意义的控制器(即,根据您的层次结构,将其放在根视图控制器中可能是有意义的)。应用程序委托有一个有限的用途:设置应用程序,并仅处理特定事件。剩下的事你自己去做,其他地方。我想我假设appDelegate的一部分是像打开GPS一样设置应用程序,但我明白你的意思。我会改变的。