別のクラスから変数値を設定およびアクセスする方法
-
04-10-2019 - |
質問
Quartzdemoのサンプルアプリを変更しており、すでに含まれている他のクラスで整数型変数の値を設定および読み取りたいと考えています。
たとえば、mainviewcontroller.mでは、ファイルQuartzimages.mで数値(1〜100からの単純な数値)を変数に設定したいと考えています。
質問は、変数を適切に定義する方法、値を設定およびアクセス(読み取り)する方法です。
私は一般的にOBJ CとiPhone SDKの初心者であり、DelphiとVBでの経験がありますが、これはまったく役に立ちません:)
この無限のグーグルループから私を連れて行ってくれる人は誰でも、どこにいてもありがとう。
解決
変数がある場合、プロパティを読み取り、設定する2つの方法があります(通常、IVARとアクセサの方法の組み合わせです)。古い方法(まだ一部が好む)は、アクセサの方法を直接使用することです。
//MYObject *obj, with int property foo
int i = [obj foo]
[obj setFoo:32]
新しい方法は、Dot-Syntax(プロパティでのみ機能し、より複雑な方法では使用できない)を使用することです。
int i = obj.foo //equivalent to [obj foo]
obj.foo = 32 //equivalent to [obj setFoo:32]
これがあなたを混乱させているなら、私はのコピーを手に入れることを強くお勧めします アーロン・ヒレガスの本. 。 CocoaとObjective-Cを詳細に説明しています。
編集: ここでの混乱のいくつかは用語に関するものだと思います。 Objective-Cでは、ほとんどのオブジェクトにはインスタンス変数(IVAR)があり、実際にデータを保存します。ただし、一般に、特に他のオブジェクトから、ivarsに直接アクセスすることを避けたいと考えています。 (これはオブジェクト指向のデザインの原則であり、Objective-Cに実際には固有ではありません。)
これが主な理由は、柔軟性を高めることです - 私がクラスを持っている場合 Person
インスタンス変数があります age
, たとえば、将来の実装を変更して、年齢を動的に決定することをお勧めします。他のクラスがインスタンス変数に依存している場合 age
, 、実装が変更されると壊れます。
この問題を回避する方法は、IVARへのアクセスを制御するメソッドであるアクセサを使用することです。 Objective-Cでは、「Getters」は変数を取得し、通常は変数と同じものと呼ばれます(したがって、 Person
たとえば、ゲッターはそうなるでしょう -(int)age
)そして「セッター」は変数を設定します(名前が付けられます -(void)setAge:(int)theAge
)。アクセサーを使用する場合、将来的には実装を自由に変更できます。また、必要に応じて、依存しないクラスを破ることなく、IVARを完全に取り除くこともできます。
Objective-Cでは、IVARとアクセサーズの組み合わせは「プロパティ」と呼ばれることがよくあります(ただし、値が動的に作成された場合、IVARである必要はありませんが)。プロパティの観点から考える場合、他のクラスのIVARを心配する必要はありません。実装の詳細です。 Objective-C 2.0には、プロパティを作成するための素敵な構文シュガーがあります。
//Person.h
@interface Person : NSObject {
int age;
}
@property (assign) int age; //declares the accessors
@end
//Person.m
@implementation Person
@synthesize age; //implements -(int)age and -(void)setAge:theAge
@end
覚えておくべき重要なことは、ほとんどの場合、IVARではなくプロパティの観点から考えるべきです。他のクラスでIvarsに直接アクセスしないでください。スーパークラスでivarsにアクセスすることはめったにありません。あなたが純粋主義者なら、あなたはアクセサーズを除いて同じクラスでivarsに直接アクセスするべきではありません、 init
, 、 と dealloc
(そして後者の2つは議論の対象となります)。