回答:
MrMageによってリンクされた記事はもう機能していません。そこで、Objective-Cでの(非常に)短時間のコーディングで私が学んだことを次に示します。
非アトミックvs.アトミック-「アトミック」がデフォルトです。常に「nonatomic」を使用してください。なぜなのかはわかりませんが、読んだ本には「原子」を使う理由が「めったにない」とありました。(ところで、私が読んだ本はBNRの「iOSプログラミング」の本です。)
readwriteとreadonly-「readwrite」がデフォルトです。@synthesizeを実行すると、getterとsetterの両方が作成されます。「読み取り専用」を使用すると、セッターは作成されません。オブジェクトのインスタンス化後に変更したくない値に使用します。
保持、コピー、割り当て
atomic
ことを勧めるのは、アドバイスするのと同じくらい悪いnonatomic
です。どちらの選択も「正しい」ものではないため、言語設計者は2つのソリューションのうち安全な方を選択しました。実際にnonatomic
は、非常に高価なスレッドロックが省略されるため、一般的にはより良い選択です。使用する唯一の理由atomic
は、プロパティが複数のスレッドから設定されている可能性がある場合です(その場合、プロパティを省略すると、オーバーリリースやリークにつながる可能性があります)。
@propertyの属性について知る前に、@ propertyの用途を知っておく必要があります。
@propertyは、クラスがカプセル化する予定の情報を定義する方法を提供します。@propertyを使用してオブジェクト/変数を宣言すると、そのオブジェクト/変数は、そのクラスをインポートする他のクラスからアクセスできるようになります。
ヘッダーファイルで@propertyを使用してオブジェクトを宣言する場合は、実装ファイルで@synthesizeを使用してオブジェクトを合成する必要があります。これにより、オブジェクトがKVCに準拠します。デフォルトでは、コンパイラはこのオブジェクトのアクセサメソッドを合成します。
アクセサメソッドは、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
アトミックはデフォルトの動作です。オブジェクトがアトミックとして宣言されている場合、そのオブジェクトはスレッドセーフになります。スレッドセーフとは、一度にそのクラスの特定のインスタンスの1つのスレッドのみがそのオブジェクトを制御できることを意味します。
スレッドがゲッターメソッドを実行している場合、他のスレッドはそのオブジェクトに対してセッターメソッドを実行できません。遅いです。
@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"];
名前は影響を受けません。
コンパイラーはゲッターを生成しますが、セッターは生成しません。
@property (readonly) NSString *name;
読み取り専用の反対です。
@property (readwrite) NSString *name;
ガベージコレクションが有効になっている場合、保持と割り当ては基本的に交換可能であることに注意してください。
@property (assign) NSInteger year;
ARCが付属しています。
@property (nonatomic, strong) AVPlayer *player;
ブール型プロパティ(YESまたはNOの値を持つプロパティ)の場合、getterメソッドは「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 //デフォルト
- 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]を同時に呼び出すと、この操作に関係するsetter / getter呼び出しがないため、この操作がクラッシュする可能性があります。つまり、オブジェクトは読み取り/書き込みセーフ(ATOMIC)ですが、別のスレッドがオブジェクトに任意のタイプのメッセージを同時に送信できるため、スレッドセーフではありません。開発者は、そのようなオブジェクトのスレッドセーフティを確保する必要があります。
プロパティ「name」が非アトミックである場合、上記の例のすべてのスレッド-A、B、C、およびDが同時に実行され、予期しない結果が生成されます。アトミックの場合、A、B、Cのいずれかが最初に実行されますが、Dは並行して実行できます。
例:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
例:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
BJホーマーのおかげで、強くて弱い説明:
オブジェクトが犬であり、犬が逃げ出したい(割り当て解除されたい)と想像してください。強いポインタは犬の首輪のようなものです。犬に紐を付けている限り、犬は逃げません。5人が1本の犬にリーシュを取り付けた場合(1つのオブジェクトへの5つの強力なポインタ)、犬は5つすべてのリーシュが外れるまで逃げません。一方、弱いポインタは、犬を指して「見て!犬!」と言う小さな子供たちのようなものです。犬がまだひもにつながっている限り、小さな子供たちは犬を見ることができ、彼らはそれを指さし続けます。しかし、すべての鎖が外れるとすぐに、いくつの小さな子供が指を指していても、犬は逃げます。最後の強いポインタ(リーシュ)がオブジェクトを指さなくなるとすぐに、オブジェクトは割り当て解除され、すべての弱いポインタはゼロにリセットされます。弱く使うと?weakを使用したいのは、保持サイクルを回避したい場合のみです(たとえば、親が子を保持し、子が親を保持するため、どちらも解放されません)。
例:
@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;
Atomicプロパティは、一度に1つのスレッドのみがアクセスできます。これは、あるスレッドセーフ。デフォルトはアトミックです。キーワードアトミックがないことに注意してください
非アトミックは、複数のスレッドがアイテムにアクセスできることを意味します。これはスレッドに対して安全ではありません。
したがって、アトミックを使用するときは注意が必要です。コードのパフォーマンスに影響するためです。
iOSのobjective-cのプロパティに関するこのリンクを優先してください...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html