我正在进行处理并使用此代码
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
。
答案 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
范围之外,仍有可用的资产。但是,它允许访问另一个相同类型和名称的对象!