2013-04-18 59 views
-1

我工作corelocation和又写道这个代码需要帮助就@property概念

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

Myclass.h:

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

MyClass.m

@implementation MyClass 

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

@end 

在我的视图控制器在哪里在i中写了corelocation代码TS viewdidload我这样做:

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

    [myClassObj giveMeOk]; 
. 
. 
. 

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

+0

我不unserstand。你说你通过创建一个属性来解决你的问题。你的代码不会显示一个属性,而是一个局部变量。请说明你的问题,它很难回答这样的问题。谢谢。另外,你使用的是ARC吗? – katzenhut

+0

属性不需要编写Objective-C代码。实际上,它们只不过是自动生成的方法和变量。 – borrrden

+0

请定义你的意思是“不要工作”。你期望什么样的行为?你取得了什么结果? –

回答

1

我认为您可能遇到的问题是当您不使用本地变量“创建属性”时。区别在于,一旦变量的作用域已经结束(通常是创建方法的结束),它将被释放,因此不会调用位置管理器之类的委托方法(因为不再需要调用某个对象他们,即使您的代理仍然存在)

通过创建你增加的对象属性保留计数,确保对象的生命持续的时间超过它在

更新创建的方法:

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

+0

请再次查看我的问题我更新它。 –

+2

该更新让我觉得我是对的。问题是你不了解对象的生命周期。一个局部变量只存在于其创建的范围内,对于需要继续在该方法之后工作的事物(即位置管理器),您需要一个属性。对于立即执行其工作的东西(例如您的示例类),局部变量很好 – wattson12

+0

非常感谢.....我的概念现在非常清晰。 –

0

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

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

+0

请再次查看我的问题我更新它。上面的 –

+0

@ wattson12答案完美地描述了你的情况。 – Wain

0

您正在混合实例变量的属性。只有当你想从外部访问一个属性时才需要属性。调用者甚至不关心该属性是否对应于一个实例变量,或者哪个属性对应于一个实例变量,尽管存在一个insance变量是相当普遍的,并且在很多情况下,当属性(和之前的属性)被称为_abc或abc时)被称为abc。如果你不合成它,那么实例变量_abc被重新赋值相同的类型。

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

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

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