blog

<iOS知識体系> 属性キーワードと修飾子

5.ぶら下がりポインタが生成される assign によって変更されたオブジェクトが解放された後も、ポインタはオブジェクトの元のアドレスを指しており、ポインタはぶら下がりポインタになります。このポインタ...

Dec 9, 2020 · 4 min. read
シェア

1.メモリ管理

  • を割り当てます:

    1. 基本データ型とオブジェクト型の両方を変更できます;

    2. セッターメソッドの実装は基本的な代入で、一般的に基本的なデータ構造に使用されます;

    3. NSInterger、BOOL、int、floatなどの基本データ型を変更します;

    4. 参照カウントを増やさずにオブジェクト型を変更します;

    5.ダングリングポインタが生成され、解放された後に変更されたオブジェクトを割り当て、ポインタはまだ元のオブジェクトのアドレスを指して、ポインタはダングリングポインタになります。ポインタを介して元のオブジェクトにアクセスし続けると、それはプログラムのクラッシュにつながる可能性があります。

  • 弱い。

    1.オブジェクトタイプのみを変更できます;

    2.ARCでのみ使用可能;

    3.弱い参照を変更し、オブジェクトの参照カウントを増やさない、循環参照を避けるために使用することができます;

    4.weakはリリースされた後にオブジェクトを修正し、自動的にポインタをnilに設定します;

  • 保持:

    1. MRCでは使用され、ARCでは強力;

    2. 強い参照を変更し、ポインタが元々指していた古いオブジェクトを解放し、新しいオブジェクトの参照カウントに1を追加しながら、新しいオブジェクトを指します;

    3.セッターメソッドの実装は、古い値を解放し、新しい値を返します;

  • 強い

    1.アークでのみ使用可能;

    2.原理はretainと同じ;

    3.ただし、ブロックを変更する場合、strongはcopyと同等、retainはassginと同等;

  • コピー。

    1.セッターメソッドの実装は、古い値を解放し、新しい値をコピーするもので、NSString、ブロックなどの型に使用されます;

2.所有権修飾子

  • __strong。

    1.strong参照は、strong、remain、copyキーワードに対応するオブジェクトを保持します;

    2.コンパイラは、strong、retain、copyによって変更されたプロパティに対して、__strong所有修飾子を持つインスタンス変数を生成します;
  • __weak。

    1.弱い参照は弱いキーワードに対応するオブジェクトを保持し、循環参照を防ぐために ARC で使用されます;

    2.コンパイラは、weakによって変更されたプロパティに対して、 __weak all修飾子を持つインスタンス変数を生成します;
  • __unsafe_unretained。

    1.unsafe_unretained、assginキーワードに対応する、弱い参照保持オブジェクト;

    2.コンパイラは、unsafe_unretainedによって変更されたプロパティに対して、__unsafe_unretainedのすべての修飾子を持つインスタンス変数を生成します;

    3.__weakと比較して、オブジェクトがnilかどうかをチェックするためにweakテーブルをトラバースする必要がないため、パフォーマンスが向上します。しかし、ダングリングポインタが生成されます;
  • autoreleasing。

    1.MRCではautoreleaseメッセージをオブジェクトに送ってautoreleasepoolに登録することができますが、ARCでは__autoreleasing修飾子を使ってautoreleasepoolに登録することができます;

3.浅いコピーと深いコピー

  • 浅いコピー。

    ポインタのコピーは、新しいポインタを割り当てるだけで、メモリ領域の同じブロックにすることができます、実際のメモリは、メモリが破壊されたときに、コピーを発生しない、メモリのこの部分を指すように、いくつかのポインタを再定義する必要があります使用する前に、それ以外の場合は、野生のポインタになります。

    浅いコピーは、元のオブジェクトへのポインタをコピーすることですので、元のオブジェクトの参照カウント+1は、唯一の元のオブジェクトへの新しいポインタを作成すると解釈することができ、完全に新しいオブジェクトを作成しませんでした。
  • ディープ・コピー。

    内容コピー、新しいメモリ領域にデータをコピーし、コピーされたデータ領域へのポインタ。ディープコピーは、オブジェクトの特定のコンテンツをコピーすることであり、メモリアドレスは、コピーの終了後、2つのオブジェクトは、同じ値に格納されていますが、メモリアドレスが同じではない、2つのオブジェクトは、互いに干渉しない、お互いに影響を与えません自己割り当てです。

    ディープコピーは、コピーすることであり、元の唯一の同じ値ですが、メモリアドレスは完全に新しいオブジェクトとは異なる、作成した後、元のオブジェクトは、任意の関係を持っていません。
  • 概要

    ディープコピーは内容コピー、シャローコピーはポインタコピー、その本質的な違いは:
    • 新しいメモリアドレスをオープンするかどうか
    • メモリアドレスの参照カウントに影響を与えるかどうか
    • 変更可能オブジェクトに対する copy メソッドと mutablecopy メソッドはディープコピーです。
    • 不変オブジェクトの copy メソッドは浅いコピーです。
    • コピー・メソッドが返すオブジェクトは不変オブジェクトです。
  • 以下のコードにはどのような問題がありますか?
@property (copy) NSMutableArray *array;

回答:プロパティに代入されたオブジェクトがNSMuatbleArrayであろうとNSArrayオブジェクトであろうと、コピー操作後はNSArrayオブジェクトです。プロパティは、NSMutableArray型として宣言されているため、そのオブジェクトを追加し、オブジェクトを削除し、いくつかの他のメソッドを呼び出す呼び出し元があることは避けられない、コピーの結果がNSArrayのイミュータブルオブジェクトであるため、この時、NSArrayオブジェクトの呼び出しオブジェクトを追加し、オブジェクトを削除するなど、メソッドは、手続き上の例外が発生します。

  • NSString が copy を使用する理由

    copy 修飾子を使用すると、属性が変更可能な文字列からコピーされたとしても、その属性は不変な文字列に深くコピーされます。
Read next

JavaScriptクロスドメインまとめ

同じプロトコル、同じドメイン名、同じポート番号、これら3つの条件のいずれかが満たされない場合、2つのスクリプトのやり取りは許可されません。 定義:クロスドメインとは、ブラウザが他のウェブサイトのスクリプトを実行できないことを意味します。これはブラウザの同一生成元ポリシーによるもので、ブラウザがjsに課すセキュリティ制限です。プロトコル、ドメイン名、ポートのいずれかが異なる限り、それらは異なるドメインとして扱われます。

Dec 9, 2020 · 9 min read