blog

iOSの属性キーワードと関連する質問

前回の記事\n\n\n\n\n\nいつになったらあんな風になれるの?\n\n\nさて、今日は属性キーワードの話をしましょうか。 属性キーワードってなんですか?\n属性キーワードは3種類に分けられます:...

Jul 18, 2020 · 5 min. read
シェア

序文

いつになったらあんな風になれるの?

履歴書を見て、開発の基本がよくわかりましたね。 属性キーワードってなんですか?

属性キーワードは3つのタイプに分けられます:

  • 読み取りと書き込みのパーミッションの種類: readonly、readwrite
  • アトミックnonatomic
  • 引用回数 retain/strong/copy assign/unsafe_unretained weak

読み取りと書き込みのパーミッションの種類: readonly、readwrite

  • readwriteは読み書きの機能で、ゲッターメソッドとセッターメソッドは自動的に生成されます。
  • readonly は読み取り専用の機能で、ゲッター・メソッドのみを生成し、セッター・メソッドは生成しません。

原子クラス:原子非原子

アトミックとは、割り当てと取得がスレッドセーフであることを保証するものです。 これは、メンバ属性の直接の割り当てと取得を指し、操作とアクセスを表します。アトミック・プロパティでは、システムが生成するゲッター/セッターが、他のスレッドからの get および set 操作の完全性を保証します。

キーワードを保持

この関数は MRC のコンテキストでのみ使用されます。参照カウントが 0 になると、dealloc 関数が呼び出され、メモリが解放されます。

では、STRONGとWEAKの違いを教えてください。

strongはオブジェクトを指し、所有することを意味します。参照カウントが0でない限り、オブジェクトは破壊されません。参照カウントが0でない限り、オブジェクトは破壊されません。もちろん、強制的にnilにすることも破壊されます。weak オブジェクトを指し示しますが、所有はしません。このオブジェクトが変更するオブジェクトの参照カウントは増加しません。手動で設定する必要はありません。オブジェクトはメモリ内で勝手に破棄されます。

アトミックはどのようにスレッドセーフなのですか?

アトミックは、配列の代入や取得についてはスレッドセーフです。しかし、データへのオブジェクトの追加や削除などの操作のための配列は、アトミック保証の範囲ではありません。

強いと弱いの違いは何ですか?

strongはオブジェクトを指し、所有することを意味します。参照カウントが0でない限り、オブジェクトは破壊されません。参照カウントが0でない限り、オブジェクトは破壊されません。もちろん、強制的にnilにすることも破壊されます。weak オブジェクトを指し示しますが、所有はしません。このオブジェクトが変更するオブジェクトの参照カウントは増加しません。手動で設定する必要はありません。オブジェクトはメモリ内で勝手に破棄されます。

assignとweakの違いは何ですか?

assignは基本データ型、int、BOOLを変更します。assignはオブジェクト型を変更しますが、オブジェクトの参照カウントは変更しません。assignはダングリングポインタを生成します。assignされたオブジェクトが解放された後も、オブジェクトポインタは元のアドレスを指すため、ダングリングポインタが生成され、メモリリークやプログラムのクラッシュにつながります。

weakは変更されたオブジェクトの参照カウントを変更せず、それが指すオブジェクトは、それがリリースされた後、自動的にnilに設定されます。両者の違い:1. assignはオブジェクトと基本データ型の両方を変更できますが、weakはオブジェクトのみを変更します。

2.assignは、変更したオブジェクトが解放された後、元のオブジェクトのメモリアドレスを指します。 weakは、変更したオブジェクトが非推奨になった後、nilに設定されます。 しかし、これらの共通点は、変更したオブジェクトの参照カウントを変更しないということです。

copy キーワードは、オブジェクトのミュータブル・プロパティとイミュータブル・プロパティに影響しますか?

ミュータブルオブジェクト copy と mutableCopy はディープコピー イミュータブルオブジェクト copy はシャローコピー、 mutableCopy はディープコピー copy メソッド return はイミュータブルオブジェクト、コピーされるオブジェクトがミュータブルオブジェクトの場合、 return もイミュータブルオブジェクトです。例を以下に示します:

シャローコピーとディープコピーの違い

シャローコピーは単なるメモリアドレスのコピーです。 2つのポインタは同じアドレスを指し、コピーされるオブジェクトの参照カウントが増加し、新たなメモリ確保は発生しません。ディープコピー:ターゲットオブジェクトへのポインタとソースオブジェクトへのポインタは、同じ内容を持つ2つのメモリ空間を指します。

2つの特徴:コピーされるオブジェクトの参照カウントを増加させない、新しいメモリ割り当てが発生し、メモリの2つの部分があります。違いの概要:シャローコピーは、参照カウントを増加させ、新しいメモリを生成しません。ディープコピーは参照カウントを増やさず、新しいメモリを確保します。

コピーで変更されたNSMutableArrayの問題は何ですか?

ミュータブル・メソッドを呼び出すとクラッシュする制御不能な問題があります。 具体的な理由は次のとおりです:Mutableにプロパティ割り当てのコピー変更として宣言され、プロセスは次のように説明されています:1.割り当てがNSMutableArrayオブジェクトの上にある場合、ミュータブルオブジェクトは、コピー操作され、コピー結果はイミュータブルであり、その後、コピーの後にNSArrayです2.割り当てがNSArrayオブジェクトの上にある場合、イミュータブルオブジェクトは、コピー操作され、コピー結果はまだイミュータブルであり、その後、コピーの後にNSArrayです3.割り当てがNSMutableArrayオブジェクトの上にある場合、ミュータブルオブジェクトは、コピー操作され、コピー結果はまだイミュータブルであり、その後、コピーの後にNSArrayです。NSArray オブジェクトを代入する場合、イミュータブル・オブジェクトに対してコピー操作を行い、コピー結果はやはりイミュータブルで、コピー後も NSArray です。 つまり、どのオブジェクトを代入しても、NSMutableArray に対してコピー操作を行う限り、返されるオブジェクトはイミュータブルです。元のプロパティ宣言がNSMutableArrayの場合、addメソッドやremoveメソッドを呼び出しても、コピーの結果はイミュータブルオブジェクトなので、これらのメソッドを呼び出すとクラッシュします!

MRCでretain修飾変数のセッターメソッドをオーバーライドするには?

ここで重要なのは、たまたま元のオブジェクトに設定されていた場合、判定を行わないと自分のオブジェクトを解放することになり、プログラム・アクセス例外につながるということです。ですから、最初に判定を行う必要があります。

weak属性によって変更された変数が強く参照されていないときに、自動的にnilに設定されるように実装するにはどうすればよいですか?

ランタイムはweak_table_t弱参照テーブルを維持し、特定のオブジェクトへの弱ポインタをすべて格納します。弱テーブルは実際にはハッシュテーブルで、keyはオブジェクトのアドレス、valueは弱ポインタのアドレスの配列です。

オブジェクトの回復時間では、オブジェクトのアドレスによると、すべての弱いポインタの配列のアドレスになり、その中のデータをnilに設定するには、配列をトラバース

weakと_Unsafe_Unretainの違い?

Unsafe_Unretainはnilにセットされないため、ポインタがぶら下がったりクラッシュしたりしやすくなります。しかし、_Unsafe_Unretainは__weakよりも効率的です。

ここにいる生徒たちを見てください。皆さん才能があり、とても気に入っています。

作成は簡単ではありません、誰もが私は空のカップですが、記事は毎週更新し続け、この記事は悪くない場合は、私はその後、あなたに少し役に立つ何かを書くために持っているカップを 考え、私にうなずきを与えてください注目共有

Read next

デザインパターンの7つの原則

モジュール、クラス、関数などのソフトウェア・エンティティは、変更に対してクローズドであり、拡張に対してオープンであるべきです。 親クラスが出現できるところならどこでも、サブクラスが出現できなければなりません。サブクラスは、親クラスの抽象メソッドを実装し、親クラスの非抽象メソッドをカバーするためにオーバーライドしないようにすることができます。 オブジェクトは、他のオブジェクトの最小限の知識を維持する必要があります。 メンバ変数、メソッドのパラメータ、メソッドの戻り値に現れるクラスは、ストレート...

Jul 18, 2020 · 2 min read