Objective-Cの強弱の違い


308

Obj-Cは初めてなので、最初の質問は次のとおりです。

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

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


19
実際にこれは時々 、私たちは/強い弱いと原子/アトミック好みの基本的な概念は.... :) ...それを私たちに思い出させていただきありがとうございますどのように忘れて、良い質問です
andikurnia

10
@JackyBoy面白いのは、Googleで提案された単純な検索が私をここに導くことですlol。#circularreference
Jason Renaldo

10
私はグーグルでの回答の多くを信頼しない傾向がありますが、インテリジェントな回答については常にSOを参照してください
JeffK

回答:


642

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

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

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

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

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


28
@ボーン:スレッドセーフの意味によって異なります。プロパティが複数のスレッドから同時に安全に読み書きできることをatomic保証します。これは、プロパティがすべてあるオブジェクトatomicが自動的にスレッドセーフであるという意味ではありません。
Ole Begemann 2013

3
素晴らしい詳細。今まで本当に理解できなかったと思います。ありがとうございました。
ahmedalkaff 2013

1
アップルのドキュメントによると、アトミックおよび非アトミックはスレッドセーフと同義である必要があります。developer.apple.com/library/ios/documentation/cocoa/conceptual/...
Murtaza Khursheedフセイン

5
「注:プロパティの原子性は、オブジェクトのスレッドセーフと同義ではありません。」developer.apple.com/library/ios/documentation/cocoa/conceptual/...
GS

必要のないときにインスタンスを削除しないのはなぜですか?不要なときに気球から空気を取り出したり、気球を破壊したりできないのはなぜですか?取り付けられている紐に注意する必要があるのはなぜですか?データが必要です。
Ashish Pisey

707

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

少なくとも1人の人がそれに取り付けられた紐を握っている限り、風船は飛んでいきません。紐を持っている人の数が保持数です。誰も弦を握っていないとき、気球は飛び去ります(割り当て解除)。多くの人が同じ風船に紐を付けることができます。強い参照と弱い参照の両方で、参照されたオブジェクトのプロパティを取得/設定し、メソッドを呼び出すことができます。

強い参照は、そのバルーンへの紐を握っているようなものです。風船に取り付けられた紐を握っている限り、飛んでいきません。

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


68
+2(私ができる場合のみ)。マジで本当にクリエイティブな説明!
Con Antonakos、2014年

25
iOSの開発から1年半後、私はたった今、私は何が何で何strongweak意味するのかを明確に理解したと思います。
Isuru

17
@ X.Li保持サイクルは、バルーンに2つのストリングがあるようなもので、1つは所有者(このバルーンを所有している)が所有し、もう1つはバルーン(所有者がこのバルーンを所有している)が所有しています。ストリングにしかアクセスできないので、風船が行きたくない場合はどうやって風船を手放しますか?したがって、風船はあなたを所有していない(弱い)一方で、風船を所有している(強い)方が良いです。手放したいときは、文字列をカットしてください:)
snakeninny '27年

5
彼のプロフィールを読んでください。彼はiOSのインストラクターです。とてもクリエイティブな説明!! 帽子オフ:)
Hemang 2015年

3
アトミックvs非アトミック私は、複数のドアがあり、中央に1つのトイレがある公衆トイレとして説明できます。誰かが1つのドアからトイレに入ると、厄介な瞬間を経験したくない場合は、他のすべてのドアをトイレにロックすることもできます。笑。このナンセンスなアナロジーを読んでくれてありがとう。
Chen Li Yong

24

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

弱い:入力値を保持せずにそれに割り当てます。

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


12

ダミーの答え:-

私はちょうど使用する場所を教えてくれつもりだので、私は、説明は上記の回答に与えられていると思うSTRONGし、使用する場所WEAK

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

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


2
そして、etcには何が含まれています:P
Rajneesh071

3
webView、mapViewなど
shubham mishra 2016年

4
実際に、ストーリーボードにドラッグアンドドロップするサブビューのほとんど
shubham mishra 2016年

8

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

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

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

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

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

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

詳細な説明については、こちらをご覧ください@プロパティと属性をわかりやすく説明


6

ここでは、アップルのドキュメントでさまざまな例を使用して、弱いプロパティと強いプロパティの違いを説明しています。

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3

ここでは、このブログの著者は同じ場所ですべてのプロパティを収集しています。プロパティの特性を比較するのに役立ちます:

http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html


6

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

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


2

強い参照と弱い参照を理解するために、以下の例を考えてみましょう。displayLocalVariableという名前のメソッドがあるとします。

 -(void)displayLocalVariable
  {
     UIView* myView = [[UIView alloc] init];
     NSLog(@"myView tag is = %ld", myView.tag);
  }

上記のメソッドでは、myView変数のスコープはdisplayLocalVariableメソッドに制限されています。メソッドが完了すると、UIViewオブジェクトを保持しているmyView変数がメモリから割り当て解除されます。

次に、ビューコントローラーのライフサイクル全体でmyView変数を保持する場合はどうでしょうか。このために我々は(参照変数MYVIEWへの強い参照を持っていますusernameViewという名前のプロパティを作成することができます@property(nonatomic,strong) UIView* usernameView;し、self.usernameView = myView;以下のように、コードの下で)

@interface LoginViewController ()

@property(nonatomic,strong) UIView* usernameView;
@property(nonatomic,weak) UIView* dummyNameView;

- (void)displayLocalVariable;

@end

@implementation LoginViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

}

-(void)viewWillAppear:(BOOL)animated
{
     [self displayLocalVariable];
}

- (void)displayLocalVariable
{
   UIView* myView = [[UIView alloc] init];
   NSLog(@"myView tag is = %ld", myView.tag);
   self.usernameView = myView;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}


@end

上記のコードでは、myViewがself.usernameViewに割り当てられており、self.usernameViewが(@propertyを使用してインターフェイスで宣言したように)myViewへの強い参照を持っていることがわかります。したがって、myViewは、self.usernameViewが有効になるまでメモリから割り当て解除されません。

  • 弱い参照

次に、弱い参照であるdummyNameViewにmyNameを割り当てることを検討してください。self.dummyNameView = myView;強い参照とは異なり、弱い参照はmyViewへの強い参照が存在するまでのみmyViewを保持します。弱参照を理解するには、以下のコードを参照してください。

-(void)displayLocalVariable
  {
     UIView* myView = [[UIView alloc] init];
     NSLog(@"myView tag is = %ld", myView.tag);
     self.dummyNameView = myView;
  }

上記のコードには、myViewへの弱い参照があります(つまり、self.dummyNameViewにはmyViewへの弱い参照があります)が、myViewへの強い参照はないため、self.dummyNameViewはmyView値を保持できません。

ここで、以下のコードをもう一度考えます。

-(void)displayLocalVariable
      {
         UIView* myView = [[UIView alloc] init];
         NSLog(@"myView tag is = %ld", myView.tag);
         self.usernameView = myView;
         self.dummyNameView = myView;
      } 

上記のコードでは、self.usernameViewにmyViewへの強い参照があるため、myViewに強い参照が関連付けられているため、メソッドが終了した後でもself.dummyNameViewの値はmyViewになります。

これで、変数への強い参照を行うたびに、保持カウントが1つ増加し、保持カウントが0に達するまで変数は割り当て解除されません。

お役に立てれば。


2019-07-25 12:33:15.479002 + 0530 StrongAndWeak [6329:245483]私の名前はABC 2019-07-25 12:33:15.479226 + 0530 StrongAndWeak [6329:245483]私の名前は強い= ABC 2019- 07-25 12:33:15.479418 + 0530 StrongAndWeak [6329:245483]私の名前はウィーク= ABCですこれでウィークプロパティにmynameの値がないと伝えましたが、両方の参照でmyname値をABCとして取得しています.. ..?もっと明確な答えを出すことができます....ありがとう事前に
Madhu_Nani

@Raviteja_DevObal ARCはすぐに実行することを約束しません(つまり、文字列@ "ABC"の割り当てを解除します)が、後で確実に割り当て解除されます...
Mahadev Mandale

@Raviteja_DevObal As Explain ここでは、文字列はこれの悪い例です。私はUIViewオブジェクトで私の答えを更新しました、それが役に立てば幸いです。
Mahadev Mandale

1

強力:基本的に、別のクラスとの間でデータを送受信するために使用したプロパティで使用されます。 弱い:通常、すべてのコンセント、接続はインターフェイスからの弱いタイプです。

非アトミック:このタイプのプロパティは、アウトレットまたはオブジェクトを異なる同時スレッドで共有したくない場合に使用されます。つまり、Nonatomicインスタンスは、一度に1つのスレッドを処理するようにプロパティを作成します。うまくいけば、それはあなたのために役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.