ねえ、私はObjective Cプログラミングに非常に慣れていないので、立ち往生しています。関数を作成すると、ラベルやテキストビューなどに作成した変数を使用できないのはなぜですか。また、viewDidLoad 関数でそれらを呼び出すたびに、self.(variableName) または _(variableName) のいずれかを実行する必要があります。 viewDidLoad 関数の外ではそれを行うことはできません。それの外にそれらにアクセスする方法はありますか?
2 に答える
関数を作成すると、ラベルやテキストビューなどに作成した変数を使用できません。
まず、関数とインスタンス メソッドを区別する必要があります。Objective-C では、クラスはインスタンス変数 (そのクラスのインスタンスの一部である変数) とインスタンス メソッド (そのクラスのインスタンスに関連付けられた関数に似ています) を持つことができます。クラスはプロパティを持つこともできます。プロパティは、オブジェクトに関連付けられた値であるという点でインスタンス変数のように使用されますが、アクセサー メソッドを介してアクセスされます。一方、関数はどのクラスにも属しません。したがって、クラスには、次のように、インスタンス変数とメソッドが宣言されるインターフェイスがあります。
@interface Person : NSObject
{
NSString *firstName;
NSString *lastName;
}
@property (readonly) NSString *fullName;
@property (strong) NSArray *friends;
@property (assign) int age;
- (id)initWithFirstName:(NSString*)first lastName:(NSString*)last;
- (void)addFriend:(Person*)friend;
@end
また、次のような実装もあります。
@implementation Person
- (id)initWithFirstName:(NSString*)first lastName:(NSString*)last
{ /* code goes here */ }
- (void)addFriend:(Person*)friend
{ /* code goes here */ }
- (NSString *)fullName
{ return [NSString stringWithFormat:@"%@ %@", firstName, lastName; }
@end
実装内のこれらのものは、最初の で示されているようにインスタンス メソッドであり、それらがブロック-
で定義されているという事実です。@implementation
(+
の代わりに があれば-
、それらはインスタンス メソッドではなくクラス メソッドになります。それについてはドキュメントで説明します。) プロパティは、通常のメソッド呼び出しまたはドット表記を使用して適切なアクセサー メソッドを呼び出すことによってアクセスされます。あなたが持っている場合:
Person *george = [[Person alloc] initWithFirstName:@"George" lastName:@"Bailey"]
これらはすべて有効です。
NSString *name1 = george.fullName;
NSString *name2 = [george fullName];
george.age = 45;
[george setAge:45];
int years1 = george.age;
int years2 = [george age];
また、self
「現在のオブジェクト」へのポインタです。オブジェクトが独自のメソッドを呼び出して独自のプロパティにアクセスできるように、インスタンス メソッドで使用できます。たとえば、Person
クラスには次のようなメソッドを含めることができます。
- (NSString *)nameAndAge { NSString *nameAndAge = [NSString stringWithFormat:@"%@: %d", self.fullName, self.age]; }
一方、関数はクラスの一部ではなく、Objective-C メソッド構文ではなく C 関数構文を使用し、@implementation
ブロックで定義されていません。
BOOL isMiddleAged(Person* person)
{
return (person.age > 30) && (person.age < 60);
}
self
関数はオブジェクトに関連付けられていないため、 in functionを使用できません。そのためself
、指すものは何もありません。person.age
ただし、上記の例のように、既知の他のオブジェクトのプロパティを使用することはできます。
そして、viewDidLoad関数でそれらを呼び出すたびに、self.(variableName)または_(variableName)のいずれかを実行する必要があり、viewDidLoad関数の外でそれを行うことはできません.
ビュー コントローラーのプロパティにアクセスしている必要があります。上で説明したように、self.(variableName)
プロパティにアクセスする方法です。_(variableName)
プロパティの値を格納する変数 (多くの場合、コンパイラによって生成される) を参照します。(通常は、これらの変数に初期化メソッドの外部で直接アクセスするべきではなく、-dealloc
代わりにプロパティ アクセサーを使用してください。) これらのプロパティは、 だけでなく、クラスの任意のインスタンス メソッド-viewDidLoad
で使用できます。で行ったようにself
、オブジェクトへのポインターの名前に置き換えることで、他のオブジェクトのプロパティにアクセスすることもできます。person
isMiddleAged()
自動合成されたプロパティを使用しているようです。自動合成プロパティを使用すると、オブジェクトを @syhtesize する必要はありません。
@sythesize object = _object;
この場合、暗黙的に実装されます。
したがって、self.object または _object を使用してオブジェクトにアクセスできます。
@synthesize を使用して、 self.varName または _varName を介してオブジェクトを使用しないようにすることができます。varName を使用して直接使用できます。