2011-08-16 7 views
0

私はプログラミングを勉強しています。しかし、私は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]; 
} 

最初の質問は、私はsharedAccelerometer

であり、それはシステムの共有オブジェクトを返すメソッドを使用する、のviewDidLoadです。

viewDidLoadが終了したとき、ローカル変数、加速度計は消えませんか?

私は加速度計オブジェクトを取得すると、それがなくなったと思います。

viewDidLoadが終了しているため、インスタンス変数がありません。

これはローカル変数です。

秒は委任方法です。

私は、accelerator.deleate = selfをviewDidLoadで言うとします。

しかし、私は、加速度計について、インスタンス変数を持っていない、のviewDidLoadが終了したとき、そのメソッドが呼び出され、どのように?そう

私はUIAccelerometerオブジェクトをどのように保つことができるのか分かりません。

私を助けてください。

答えて

4

[UIAccelerometer sharedAccelerometer]は常に同じ加速度計オブジェクト(singleton)を返しますので、どこでも使用できます。

+0

答えていただきありがとうございます。しかし、私はまだ理解していません。そして、それはシングルトンです。しかし、私はsharedAcceleometerと言うと、それはシングルトンによって作られたオブジェクトだと思います。しかし、私はそれを使用したいとき、私はオブジェクトを指す必要があると思う。なぜなら、viewDidLoadが終了すると、オブジェクトはまだ存在していますが、私はポインタを失ってしまい、使用できません。私が間違っている? – MoonSoo

+0

あなたはポインタを失っていますが、 '[UIAccelerometer sharedAccelerometer]'をもう一度呼び出すと、同じポインタが得られます。 – jtbandes

+0

最後のご質問ありがとうございます。私はdeallocでそのオブジェクトを解放する必要はありませんか?デリゲートメソッド、2つの引数、1つは加速度計、もう1つは加速です。このコードの第2引数では、加速度はBallViewクラスで解放されます。しかし、最初のことは、加速度計は決してリリースされていない、それは正しいですか?または私はdeallocでそれを解放する必要がありますか? – MoonSoo

0

だけ

@property(nonatomic,retain) UIAccelerometer accelerometer; 

あなたのヘッダファイルに

UIAccelerometerプロパティを作成し、その後、このようなあなたの viewDidLoadでそれを割り当てることができます。今、あなたは self.accelerometer

による加速度計にアクセスすることができます

*accelerometer = [UIAccelerometer sharedAccelerometer]; 

専用ケースはこちら

はい、viewDidLoadが完了すると、作成した加速度計オブジェクトにはアクセスできなくなります。 - あなたはいつも[UIAccelerometer sharedAccelerometer]シングルトンプロバイダーからそれを呼び出すことができます。 (常に同じオブジェクトを返します)

デリゲートは、特定のオブジェクトの呼び出し/イベントを処理中に処理します。

は、このようにあなたも、このステートメントを使用することができます - あなたは、このためにUIAccelerometerDelegateプロトコルに準拠していることを確認してください:あなたがオブジェクトのデリゲートを設定すると

[UIAccelerometer sharedAccelerometer].delegate = self

+0

お返事ありがとうございました:) – MoonSoo

0

、あなたはそれを一つのカウントを保持していインクリメント。そのため、ローカル変数accelerometerを持っていても、関数が返ってからスコープの外に出ると、UIAccelerometerオブジェクトがデリゲートとして設定されたクラスは、そのクラスが保持カウント0に達するまでそれを保持します。

オブジェクトへの参照を保持したい場合は、実際にこれを行うのが最善の方法は、クラスの先頭に空のカテゴリを作成し、そこにアクセラレータのivarを宣言することです。

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

...

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

お返事ありがとうございます:) – MoonSoo

関連する問題