1

私はiPhone用に開発した経験がありますが、完全に独学で、練習を改善しようとしています。これはおそらくプログラミングのかなり入門的な質問です。

オブジェクトのすべてのインスタンスに共通の値を持つインスタンス変数を維持するための最良の方法(またはそれが可能)は何ですか?オブジェクトとその属性の作成、変更、およびチェックをさまざまな場所で行うことは可能ですか?

ユーザーが画面をスワイプした回数を追跡するオブジェクトがあるとします。たとえば、AppDelegateでそのオブジェクトを割り当ててから、別のView Controllerからそのオブジェクトのカウント変数を何らかの方法でインクリメントすることは可能ですか?

それが属するオブジェクトのすべてのインスタンス間で共有されるようにインスタンス変数を定義することは可能ですか?それで問題は解決します。

これまでのところ、AppDelegateでIVARを作成して、追跡する必要があるこのようなものを作成し、次のようにアクセスしました。

((MyAppDelegate *)[UIApplication sharedApplication].delegate).instanceVariable

しかし、それが良い習慣かどうかはわかりません。おそらくそうではありません。

多分これはグローバル変数またはシングルトンに関連しています。または、上に表示される接頭辞「共有」と私は他の場所でも見ました。私はただアドバイスや方向性を探しています。この質問が理にかなっていて、あまり一般的ではないことを願っています。

4

5 に答える 5

2

あなたが尋ねている質問には、さまざまな状況に応じたさまざまな実践が含まれていると思います。ビューコントローラ間でデータを共有することは、多くのソリューションで1つの質問です。より良い方法のひとつは、すべてのビューコントローラにデリゲートを使用することです。

クラスにすべてのオブジェクトを管理させたい場合は、オブジェクトが出入りする場合でも、次の2つのいずれかを実行できます。

  1. クラスにシングルトンを持たせ、割り当てと割り当て解除を追跡して、クラスがいつ作成され、次にそれ自体を破棄する必要があるかを把握します(必要な場合)。これは悪い方法ではありませんが、もっと手間がかかるかもしれません。

  2. 他のクラスのオブジェクトを管理するコントローラークラスを作成します。良い例は、viewcontrollerクラスによって制御されるビューのクラスです。

他の人の提案を見てみましょう。

于 2010-01-20T00:50:37.240 に答える
1

C ++またはJava(など)では、探しているのは「静的インスタンス変数」です。これはまさにあなたが説明しているものです。つまり、クラスのすべてのインスタンスで共有されるインスタンス変数です。Objective-Cにはそのような獣は正確にはありませんが、通常のC構文を使用して非常によく似たものを提供できます。

このページの下部を参照してください:http: //iosdevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html

(ページが消えた場合に備えて、そこにあるコードのコピー:)

@interface MyClass 
{
  // ...
}
+ (NSString *)myVar;
+ (void)setMyVar:(NSString *)newVa;
@end

@implementation MyClass
static NSString *myVar;
+ (NSString *)myVar { return myVar; }
+ (void)setMyVar:(NSString *)newVar { myVar = newVar; }
@end

この場合、「myVar」は.mファイルに対してグローバルですが、「静的」とマークされているため(これはCトリックです)、コンパイラーはその可視性を、それが含まれる.mファイルのみに制限します(このようなものと同様) 、マルチスレッドアクセスを使用する場合は、注意してください。)

FWIW、一般的に堅牢である必要があるものを構築している場合は、誰もが共有するシングルトンのようなオブジェクトが良い方法です。そうすれば、通常のObj-Cの良さ(必要に応じてmem管理)をすべて得ることができます。

于 2010-01-20T01:00:27.920 に答える
1

Matt Gallagherは、まさにその問題に関するすばらしい記事を投稿しました。ココアウィズラブでご覧いただけます。

ただし、mahboudzが述べたように、複数のビューコントローラのパターンでは、委任が優先されます。

于 2010-01-20T01:01:26.823 に答える
0

シングルトンをリソースマネージャーとして使用することを検討します。リソースマネージャーの部分は必要ないかもしれませんが、シングルトンは大いに役立ちます。

于 2010-01-20T00:49:21.403 に答える
0

すべてをアプリデリゲートに保持し、必要な場所にアクセスすることは間違いなく悪い習慣です。少なくとも、コードの再利用が難しくなることを意味します。新しいアプリを作成し、ビュー、コントロール、またはシステムの一部を使用する場合は、新しいアプリデリゲートがすべての適切なセレクターとプロパティを実装していることも確認する必要があります。また、アプリが成長するにつれて、必然的にアプリのデリゲートが大きくなり、混乱し、処理が難しくなることに気付くでしょう。
特定の問題に関係しているコードを正確に特定するのは難しいため、デバッグも面倒になります。

私がこれを行うのは、アプリのどの部分が実際にどの情報を必要としているかをスケッチし、それらが作成されたときにそれらをViewControllerに渡すことです。

于 2010-01-20T01:04:08.483 に答える