インスタンス変数を{}に宣言し、@propertyキーワードを使用するいくつかの理解

2276 ワード

前提条件
以下の内容の理解については、Objective-Cの重要な特性であるメッセージングに注意してください.よく知られているように、OCでは[]オブジェクトを呼び出す方法を使用していますが、実際にはここで「呼び出す」を使用するのは正確ではありません.より厳密には、[object doSomething];などのメッセージをオブジェクトに送信します.これにより、OCが実行時にobjectにメッセージを送信することができます.オブジェクトオブジェクトは、実装ファイルにdoSomethingという名前のメソッドを一致させ、このとき実装ファイルにdoSomethingという名前の無パラメータメソッドが存在しない場合、プログラムの実行にエラーが発生します.この方法を実行することがあります.もう1つの比較的よく使われるのは、OC 2.0以降、OCは「点文法」の特性を導入し、C++、javaのように「オブジェクト.属性」の形式でオブジェクトの属性にアクセスすることができ、従来のように[object ]アクセス属性を使用する必要がなく、[object set ]を使用して属性を変更する必要がない.しかし、ここでは、ポイント構文を使用して属性の変更にアクセスしますが、OC実行時に実行されるのは依然として属性に対応する「アクセス方法」です.ただし、コンパイラがコンパイル段階で属性に対応するアクセス方法を自動的に生成してくれる場合があります.
インスタンス変数を{}に宣言
インスタンス変数を{}で発生した問題に宣言する
以下のコードを見てください
@interface MyObject : NSObject{
    NSString *firstName;
    NSString *lastName;
}
@end

@implementation MyObject

@end

以上のMyObjectクラスは{}に2つのインスタンス変数を宣言した.この場合、クラス内でインスタンス変数名(インスタンス変数名)を使用してインスタンス変数にアクセスできます.
firstName = @"myName";
lastName = firstName;

しかし、例えば
//    
[self firstName]
[self setFirstName]
//    
[object firstName]
[object setFirstName]

に表示されます.この場合、コンパイラはこの2つのインスタンス変数に対応する「アクセスメソッド」を自動的に生成しません.同じ理由で、「点文法」にも合格できません.
//  
self.firstName
//  
object.firstName

に表示されます.「ポイント構文」は、最後にメッセージングに変換されて実装される(前述した).
インスタンス変数を{}に宣言する問題の解決
問題の本質を知り,以上の問題を解決するには,当然クラスにインスタンス変数の「アクセスメソッド」の宣言(ヘッダファイル)と実装(実装ファイル)を書けばよい.
@propertyキーワード
@propertyキーワードの導入により、コンパイラに対応するインスタンス変数を自動的に生成する必要がある「アクセス方法」を容易に認識させ、_ というインスタンス変数を生成することができます.ここでは,属性は最終的にインスタンス変数によって実現されるという結論も得られる.または直接コードを入力します.
@interface MyObject : NSObject{
    
}
@property NSString *firstName;
@property NSString *lastName;
@end

@implementation MyObject

@end

この場合、上記の方法を使用してインスタンス変数(プロパティ)に正常にアクセスできます.
//    
[self firstName]
[self setFirstName]
self.firstName          //   
//    
[object firstName]
[object setFirstName]
object.firstName        //   

またreadonlyキーワードを使用すると、コンパイラはgetメソッドのみを自動的に生成し、setメソッドは生成しません.
問題の後の話
@propertyは本稿で議論した役割のほか、メモリ管理にも大きな役割を果たしています.クラス変数がどこに宣言されるべきか疑問に思っている学生もいるので、本稿ではこの問題だけを議論します.他の編集者は延長しません.