「属性」という概念を理解する

1716 ワード

@property:コンパイラはこれらの属性にアクセスするアクセス方法を自動的に記述します.(このプロシージャにはコンパイラがコンパイル中に実行されるため、エディタにはこれらの「合成方法」のソースコードが表示されません)コンパイラは、クラスに適切なタイプのインスタンス変数を自動的に追加し、プロパティ名にインスタンス変数の名前として下線を付けます.@synthesize:インスタンス変数の名前を指定します.
@interface Person () 
@property  NSString * firstName;
@property  NSString * lastName;
@end

@implementation Person
//  _firstName  _lastName
@synthesize  firstName = _myFirstName;
@synthesize  lastName  = _myLastName;
@end

@dynamicは、コンパイラに、プロパティを実装するために使用されるインスタンス変数を自動的に作成したり、アクセスメソッドを作成したりしないでください.注意:アクセスプロパティのコードをコンパイルすると、コンパイラが定義されていないアクセスメソッドを発見しても、エラーは発生しません.これらのメソッドは実行期間中に見つかると信じています.実行期間に書き込みアクセス方法がない場合、プログラムはエラーを報告します.
@interface Person () 
@property  NSString * name;
@end

@implementation Person
@dynamic name;
@end

[Person setName:]: unrecognized selector sent to instance 0x7f9de5f12b90'

属性特質:原子性:デフォルトでは(atomic)、コンパイラ合成の方法はロックメカニズムによってその原子性を確保し、同期ロックのオーバーヘッドが大きく、性能の問題をもたらし、一般的には属性が原子である必要はありません.これはスレッドの安全を保証することはできません.スレッドの安全を実現するには、より深いロックメカニズムが必要です.例えば、1つのスレッドが属性値を複数回読み出す過程で、atomicと宣言されても異なる属性が読み出されます.nonatomicを備えている場合は、同期ロックは使用されず、ロックをかけなければ、そのうちの1つのスレッドが属性値を書き換えている間に、もう1つのスレッドも突然侵入して、まだ変更されていない属性を読み出し、このような場合、スレッドが読み取った属性値が間違っている可能性があります.読み書き権限:readwriteには取得と設定方法があります.readonlyは取得方法のみを有する.メモリ管理の意味:assign:設定方法は、ベース・タイプの単純な値付け操作にのみ適用されます.strong:所有関係を定義します.新しい値を設定する場合は、新しい値を保持し、古い値を解放してから、新しい値を設定します.Weak:非所有関係を定義します.新しい値を設定すると、新しい値も古い値も解放されません.指定したオブジェクトが破壊されると、属性値が空になります.unsafe_unretained:非所有関係を定義する;ターゲットオブジェクトが破壊されると、アトリビュート値は自動的に空になりません.copy:設定方法は、新しい値を保持せずにコピーします.
メソッド名:getter=取得メソッド名を指定します.
@property (nonatomic,assign,getter=isOn) BOOL on;

setter=設定メソッド名を指定します.この用法はあまり見られない.