-1

我正在处理核心定位并编写此代码

CLLocationManager *locationManager = [[CLLocationManager alloc]init];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
    [locationManager setDelegate:self];
    //[locationManager setDistanceFilter:0.0f];
    [locationManager startUpdatingLocation];


-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { 
    .
    .
    .
}

但是我的委托方法不起作用,在 15 - 20 之后我意识到我没有创建 CLLocationManager 的属性@property (strong, nonatomic) CLLocationManager *locationManager;

完成后一切正常,没有问题。我已经经历过好几次了,有时事情没有创造就可以工作@property,有时事情没有创造就绝对不能工作@property

我知道@property @synthesize创建 getter setter 会自动包含防止对象立即销毁的内存管理,但是有时代码如何在不创建的情况下工作@property

编辑:

我创建了一个新的类名MyClass

我的类.h:

@interface MyClass : NSObject
-(void)giveMeOk;
@end

我的班级.m

@implementation MyClass

-(void)giveMeOk {
    NSLog(@"Its Ok.");
}

@end

在我编写核心定位代码的视图控制器中,viewdidload我这样做了:

.
.
.
MyClass *myClassObj = [[MyClass alloc]init];

    [myClassObj giveMeOk];
.
.
.

并在控制台Its Ok.打印成功,所以它没有@property.

4

3 回答 3

1

我认为您可能遇到的问题是,当您不“创建属性”时,您使用的是局部变量。不同之处在于,一旦该变量的范围结束(通常是创建它的方法的结尾),它将被释放,因此不会调用像位置管理器这样的委托方法(因为不再有要调用的对象他们,即使你的代表仍然存在)

通过创建一个属性,您可以增加对象的保留计数,确保该对象的生命周期超出创建它的方法

更新:

你的更新让我觉得我是对的。问题是您不了解对象的生命周期:局部变量仅存在于创建它的范围内(因此对于您的示例:运行 viewDidLoad 后, myClassObj 不再存在)。对于需要在该方法之后继续工作的事情(即基本上只是轮询硬件 GPS 的位置管理器),您需要一个属性,因为它需要保留足够长的时间才能完成其工作。对于立即完成其工作的东西(例如您的示例类,它只执行日志并返回,即没有异步),局部变量很好

于 2013-04-18T08:20:15.623 回答
0

正如您所说,属性会生成 getter 和 setter 方法并管理您的内存。你没有说的是它创建了一个实例变量。这就是使您的代码工作的原因,因为它保留了您的位置管理器的实例(否则它会被释放 - 假设您使用的是 ARC)。

当您说“有时它有效”时,您需要举例说明。但是,这只能意味着其他一些类正在保留您创建的实例......

于 2013-04-18T08:10:21.807 回答
0

您将属性与实例变量混合在一起。仅当您要从外部访问属性时才需要属性。调用者甚至不关心属性是否对应于实例变量或哪个实例变量,尽管有一个实例变量是很常见的,并且在很多情况下,当属性(以及 getter ) 称为 abc。如果您不合成它,则实例变量 _abc 的类型相同。

它是保存实际数据的实例变量。

当您不需要从外部访问它时,您可以声明一个没有属性的实例变量。由于属性非常方便,您可以选择在 *.m 文件中声明属性。

你的所作所为有点危险。当您声明一个属性locationManager,然后在方法或 if 块或 for 循环或任何声明中本地声明CLLocationManager *locationManager时,您将处理同名的局部变量。这是完全合法的,但可能会导致错误。在本地范围之外locationManager仍然有可用的财产。但这允许访问另一个具有相同类型和名称的对象!

于 2013-04-18T08:37:54.280 回答