需要有关@property概念的帮助

时间:2013-04-18 07:47:21

标签: ios objective-c

我正在进行处理并使用此代码

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

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

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

    [myClassObj giveMeOk];
.
.
.

并在控制台Its Ok.中成功打印,因此无法使用@property

3 个答案:

答案 0 :(得分:1)

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

通过创建属性,您可以增加对象保留计数,确保该对象的生命周期超出其在

中创建的方法。

更新

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

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