322

私はObj-Cを初めて使用するので、最初の質問は次のとおりです。

オブジェクトへのポインタの宣言とstrongの違いは何ですか?weak@property

また、どういうnonatomic意味ですか?

4

9 に答える 9

733

バルーンの観点から強参照と弱参照について考えると役立つ場合があります。

気球は、紐につながれた人が一人でもいる限り、飛び散ることはありません。文字列を保持している人数が保持数です。誰も糸を握っていないとき、風船は飛び去ります (dealloc)。多くの人が同じバルーンに紐を付けることができます。強参照と弱参照の両方を使用して、参照先オブジェクトのプロパティを取得/設定し、メソッドを呼び出すことができます。

強い参照とは、その風船への紐にしがみつくようなものです。風船に付いている紐を握っている限り、風船は飛びません。

弱参照は、風船を見るようなものです。表示、プロパティへのアクセス、メソッドの呼び出しはできますが、そのバルーンへの文字列はありません。紐を持っている全員が手を放すと、風船が飛んでしまい、もうアクセスできなくなります。

于 2013-08-20T21:04:31.053 に答える
656

強い参照 (ほとんどの場合に使用します) は、このプロパティ/変数で参照しているオブジェクトを「所有」したいことを意味します。コンパイラは、強い参照でオブジェクトを指している限り、このプロパティに割り当てたオブジェクトが破棄されないように注意します。プロパティを に設定するnilと、オブジェクトが破棄されます (1 つ以上の他のオブジェクトもそれへの強い参照を保持していない限り)。

対照的に、弱い参照を使用すると、オブジェクトの有効期間を制御したくないことを意味します。弱参照しているオブジェクトは、少なくとも 1 つの他のオブジェクトが強参照を保持しているため、存続します。それがなくなると、オブジェクトは破棄され、weak プロパティは自動的に に設定されnilます。iOS での弱参照の最も頻繁な使用例は次のとおりです。

  1. 保持サイクルを避けるために弱く参照されるデリゲート プロパティ、および

  2. これらのビューはすでにメイン ビューによって強力に保持されているため、ビュー コントローラーのメイン ビューのサブビュー/コントロール。

アトミックと非アトミックは、コンパイラがプロパティ用に合成するゲッター メソッドとセッター メソッドのスレッド セーフを指します。atomic (デフォルト) は、(ivar がアクセスされる前にロックを追加することによって) アクセサ メソッドをスレッドセーフにするようにコンパイラに指示し、nonatomic はその逆を行います。ノンアトミックの利点は、パフォーマンスがわずかに高いことです。iOS では、Apple はほとんどすべてのプロパティに非アトミックを使用しているため、一般的なアドバイスは、同じことを行うことです。

于 2012-06-13T11:16:57.123 に答える
25

strong:入力値を割り当てます。入力値を保持し、インスタンス変数の既存の値を解放します。

weak:入力値を保持せずに割り当てます。

したがって、基本的な違いは、新しい変数を保持することです。通常は保持したいのですが、保持したくない場合もあります。そうしないと、保持サイクルが発生し、オブジェクトのメモリを解放できなくなります。例えば。obj1はobj2を保持し、obj2はobj1を保持します。この種の状況を解決するには、弱参照を使用します。

于 2012-06-13T11:14:26.750 に答える
13

ダミーの答え:-

説明は上記の回答に記載されていると思いますので、どこで使用するかSTRONG、どこで使用するかを説明しますWEAK:

の使用Weak:- 1. デリゲート 2. アウトレット 3. サブビュー 4. コントロールなど

の使用Strong:- に含まれていないすべての場所に残っていWEAKます。

于 2016-06-10T06:39:23.720 に答える
8

strongweak、これらのキーワードは、Objective-C のオブジェクト所有権を中心に展開します

オブジェクトの所有権とは何ですか?

ポインター変数は、それらが指すオブジェクトの所有権を意味します。

  • メソッド (または関数) にオブジェクトを指すローカル変数がある場合、その変数は、指されているオブジェクトを所有していると言われます。
  • オブジェクトが別のオブジェクトを指すインスタンス変数を持つ場合、ポインターを持つオブジェクトは、指し示されているオブジェクトを所有していると言われます。

ポインター変数がオブジェクトを指すときはいつでも、そのオブジェクトには所有者がいて、生き続けます。これは強い参照として知られています。

変数は、オプションで、それが指すオブジェクトの所有権を取得できません。オブジェクトの所有権を持たない変数は、参照と呼ばれます。

ここで詳細な説明をご覧くださいDemystifying @property and attributes

于 2014-11-26T13:27:39.713 に答える
7

強いがデフォルトです。オブジェクトへの強力なポインタがある限り、オブジェクトは「生きている」ままです。

weakは、参照先のオブジェクトを存続させない参照を指定します。オブジェクトへの強い参照がない場合、弱い参照は nil に設定されます。

于 2013-09-02T14:28:39.127 に答える