Objective-Cに不慣れな人として、誰かが私に@propertyディレクティブに従う、保持、割り当て、コピー、および私が見逃している他の人の概要を教えてもらえますか?彼らは何をしているのですか?
MrMageからリンクされた記事は機能しなくなりました。したがって、Objective-Cでの(非常に)短時間のコーディングで学んだことは次のとおりです。
非アトミックとアトミック-「アトミック」がデフォルトです。常に「非原子」を使用します。理由はわかりませんが、読んだ本では、「アトミック」を使用する「まれな理由」があると述べています。 (ところで:私が読んだ本はBNR「iOSプログラミング」本です。)
readwrite vs. readonly-「readwrite」がデフォルトです。 @synthesizeを実行すると、ゲッターとセッターの両方が作成されます。 「読み取り専用」を使用すると、セッターは作成されません。オブジェクトのインスタンス化後に変更したくない値に使用します。
保持vs.コピーvs.割り当て
@propertyの属性について知る前に、@ propertyの使用方法を知っておく必要があります。
@ propertyは、クラスがカプセル化する情報を定義する方法を提供します。 @ propertyを使用してオブジェクト/変数を宣言すると、そのオブジェクト/変数は、そのクラスをインポートする他のクラスからアクセス可能になります。
ヘッダーファイルで@ propertyを使用してオブジェクトを宣言する場合、実装ファイルで@ synthesizeを使用してオブジェクトを合成する必要があります。これにより、オブジェクトがKVC準拠になります。デフォルトでは、コンパイラはこのオブジェクトに対してaccessor methodsを合成します。
アクセサーメソッドは、setterおよびgetterです。
例:.h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m
@implementation XYZClass
@synthesize name;
@end
これで、コンパイラはnameのアクセサメソッドを合成します。
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
@ propertyの属性のリスト
atomic、nonatomic、retain、copy、readonly、readwrite、assign、strong、getter = method、setter = method、unsafe_unretained
atomicはデフォルトの動作です。オブジェクトがアトミックとして宣言されている場合、スレッドセーフになります。スレッドセーフとは、一度にそのクラスの特定のインスタンスの1つのスレッドのみがそのオブジェクトを制御できることを意味します。
スレッドがgetterメソッドを実行している場合、他のスレッドはそのオブジェクトに対してsetterメソッドを実行できません。遅いです。
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
このため、アトミックプロパティよりも非アトミックプロパティにアクセスする方が高速です。
@property (nonatomic)NSString *name;
Setterメソッドは、オブジェクトの保持カウントを増やし、自動解放プールのメモリを占有します。
@property (retain)NSString *name;
可変文字列が設定され、その後に変更された場合でも、インスタンスは設定時にその値をキャプチャします。 setterおよびgetterメソッドは合成されません。
@property (copy) NSString *name;
今、
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
nameは影響を受けません。
コンパイラーはゲッターを生成しますが、セッターは生成しません。
@property (readonly) NSString *name;
これは読み取り専用の反対です。
@property (readwrite) NSString *name;
ガベージコレクションが有効な場合、retainとassignは基本的に交換可能であることに注意してください。
@property (assign) NSInteger year;
ARCが付属しています。
@property (nonatomic, strong) AVPlayer *player;
ブール型のプロパティ(YESまたはNOの値を持つプロパティ)の場合、ゲッターメソッドが「is」という単語で始まるのが慣例です
@property (getter=isFinished) BOOL finished;
メソッドはコロンで終わる必要があります。
@property(setter = boolBool:) BOOL finished;
安全でない参照は、関連するオブジェクトを存続させないという点で弱い参照に似ていますが、宛先オブジェクトの割り当てが解除されるとnilに設定されません。
@property (unsafe_unretained) NSObject *unsafeProperty;
複数の属性を指定する必要がある場合は、次のようにカンマ区切りリストとしてそれらを含めるだけです。
@property (readonly, getter=isFinished) BOOL finished;
多くの記事を読んだ後、すべての属性情報をまとめることにしました:
- アトミック//デフォルト
- 非原子
- strong = retain // default
- weak = unsafe_unretained
- 保持する
- //デフォルトを割り当てる
- unsafe_unretained
- コピー
- 読み取り専用
- readwrite //デフォルト
以下は、これらの属性を見つけることができる詳細な記事へのリンクです。
ここで最高の回答をしてくれたすべての人に感謝します!!
これが記事のサンプルの説明です
例:
@property (retain) NSString *name;
@synthesize name;
例:
@property (nonatomic, retain) NSString *name;
@synthesize name;
説明する:
「name」というアトミックストリングプロパティがあり、スレッドAから[self setName:@ "A"]を呼び出し、スレッドBから[self setName:@ "B"]を呼び出し、[self name]から呼び出したとします。スレッドCの場合、異なるスレッドでのすべての操作はシリアルで実行されます。つまり、1つのスレッドがセッターまたはゲッターを実行している場合、他のスレッドは待機します。これにより、プロパティ "name"の読み取り/書き込みが安全になりますが、別のスレッドDが同時に[name release]を呼び出すと、セッター/ゲッター呼び出しがないため、この操作でクラッシュが発生する可能性があります。つまり、オブジェクトは読み取り/書き込みセーフ(ATOMIC)であるが、別のスレッドが任意のタイプのメッセージを同時にオブジェクトに送信できるため、スレッドセーフではありません。開発者は、そのようなオブジェクトのスレッドセーフを確保する必要があります。
プロパティ「名前」が非アトミックである場合、上記の例のすべてのスレッド-A、B、C、およびDが同時に実行され、予測できない結果が生成されます。アトミックの場合、A、B、Cのいずれかが最初に実行されますが、Dは引き続き並列に実行できます。
例:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
例:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
強くて弱い説明、 BJ Homerに感謝 :
私たちのオブジェクトが犬であり、犬が逃げる(割り当て解除される)ことを想像してください。強いポインターは犬の綱のようなものです。リーシュを犬に取り付けている限り、犬は逃げません。 5人が1匹の犬に綱を付けた場合(1つのオブジェクトへの5つの強いポインター)、5匹の綱すべてが切り離されるまで犬は逃げません。一方、弱いポインターは、小さな子供が犬を指差して、「見て!犬!」と言っているようなものです。犬がひもにつながれている限り、小さな子供たちは犬を見ることができ、犬はそれを指し示します。しかし、すべてのひもが外されるとすぐに、犬はそれを何人の小さな子供が指していても逃げます。最後の強力なポインター(リーシュ)がオブジェクトをポイントしなくなるとすぐに、オブジェクトの割り当てが解除され、すべての弱いポインターがゼロになります。弱いときは?ウィークを使用したいのは、保持サイクルを回避したい場合だけです(たとえば、親が子を保持し、子が親を保持するため、どちらも解放されません)。
例:
@property (nonatomic, retain) NSString *name;
@synthesize name;
例:
@property (nonatomic, assign) NSString *address;
@synthesize address;
unsafe_unretained
-unsafe_unretainedは所有権修飾子であり、ARCに保持/解放呼び出しを挿入する方法を指示します。-unsafe_unretainedは、ARCバージョンのassignです。
例:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
例:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
アトミックプロパティには、一度に1つのスレッドのみがアクセスできます。 スレッドセーフです。デフォルトはアトミックです。キーワードがないことに注意してくださいatomic
Nonatomicは、複数のスレッドがアイテムにアクセスできることを意味します。thread unsafe
そのため、アトミックを使用する際は非常に注意する必要があります。コードのパフォーマンスに影響を与えるため