2011-08-16 77 views
0

我正在学习ios编程。但我有一个问题是UIAccelerometer。我该如何保持UIAccelerometer对象?

这是代码优先。

- (void)viewDidLoad { 
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; 
accelerometer.delegate = self; 
accelerometer.updateInterval = kUpdateInterval; 
[super viewDidLoad]; 
} 

- (void)accelerometer:(UIAccelerometer *)accelerometer 
    didAccelerate:(UIAcceleration *)acceleration { 

[(BallView *)self.view setAcceleration:acceleration]; 
[(BallView *)self.view draw]; 
} 

第一个问题是viewDidLoad中,我使用的是sharedAccelerometer

的方法,它返回一个共享对象的系统。

当viewDidLoad结束时,不是局部变量,加速度计,消失?

我认为,当我得到一个加速度计对象,它不见了。

因为viewDidLoad已结束,并且我没有关于此的实例变量。

这只是局部变量。

二是委托方法。

我说,accelerometer.deleate = self in viewDidLoad。

,但我没有关于加速度计的实例变量,所以

该方法是如何被调用,当viewDidLoad中结束?

我真的不明白我该如何保持UIAccelerometer对象。

请帮帮我。

回答

4

[UIAccelerometer sharedAccelerometer]将始终返回相同的加速度计对象(一个singleton),所以你可以在任何地方使用它。

+0

感谢你回答。但我还是不明白。是的,这是一个单身人士。但我想我说共享加速度计,这是单身人士创建的对象。但我认为,当我想使用它时,我必须指出对象。因为当viewDidLoad结束时,对象仍然存在,但我失去了指针,所以我不能使用它。我错了吗? – MoonSoo

+0

你失去了指针,是的,但如果你再次调用'[UIAccelerometer sharedAccelerometer]'你会得到相同的指针。 – jtbandes

+0

谢谢你,这是最后一个问题。我不必在dealloc中释放该对象?委托方法有两个参数,一个是加速度计,另一个是加速度,在此代码中第二个参数,加速度是在BallView类中释放的。但是第一件事,加速计从来没有发布过,它是对的?或者我必须在dealloc中释放它? – MoonSoo

0

在你的头文件

@property(nonatomic,retain) UIAccelerometer accelerometer; 

只需创建一个UIAccelerometer属性,然后你可以指定它在你的viewDidLoad这样的:

*accelerometer = [UIAccelerometer sharedAccelerometer]; 

现在,您可以通过self.accelerometer

访问加速度计

特例在这里:

是的,一旦viewDidLoad完成,您创建的加速度计对象将不再可用。 - 尽管如此,您始终可以通过[UIAccelerometer sharedAccelerometer]单身人士提供商拨打电话。 (它将始终返回相同的对象)

委托处理某个对象在其生命周期中的调用/事件。

因此,你也可以使用这种说法 - 确保符合UIAccelerometerDelegate协议如下:

[UIAccelerometer sharedAccelerometer].delegate = self

+0

谢谢你的回答:) – MoonSoo

0

当您设置一个对象的代表,你增加它的一个保留计数。因此,即使您有局部变量accelerometer(该函数返回时超出范围),UIAccelerometer对象被设置为委托的类将保留它,直到该类达到保留计数为零。

如果要保留对象的引用,最好的方法是在类的顶部创建一个空类别并在其中为您的加速器声明一个ivar。

@interface myClassWithUIAccelerator() 
{ 
    UIAccelerator *accelerator; 
} 
@end 

...

- (void)viewDidLoad { 
    accelerometer = [UIAccelerometer sharedAccelerometer]; 
    accelerometer.delegate = self; 
    accelerometer.updateInterval = kUpdateInterval; 
    [super viewDidLoad]; 
} 
+0

谢谢你的回答:) – MoonSoo

相关问题