Obj-Cは初めてなので、最初の質問は次のとおりです。
違いは何ですかstrong
及びweak
内@property
のオブジェクトへのポインタの宣言は?
また、どういうnonatomic
意味ですか?
Obj-Cは初めてなので、最初の質問は次のとおりです。
違いは何ですかstrong
及びweak
内@property
のオブジェクトへのポインタの宣言は?
また、どういうnonatomic
意味ですか?
回答:
強力な参照(ほとんどの場合に使用します)は、このプロパティ/変数で参照しているオブジェクトを「所有」することを意味します。コンパイラーは、このプロパティに割り当てたオブジェクトが、強い参照でポイントされている限り破棄されないように注意します。プロパティをに設定するnil
と、オブジェクトは破棄されます(他の1つ以上のオブジェクトもそのオブジェクトへの強い参照を保持している場合を除く)。
対照的に、弱い参照では、オブジェクトの存続期間を制御したくないことを示します。弱く参照しているオブジェクトは、少なくとも1つの他のオブジェクトがそれへの強い参照を保持しているため、存続しているだけです。それが当てはまらなくなると、オブジェクトは破棄され、弱いプロパティは自動的にに設定されnil
ます。iOSでの弱参照の最も頻繁な使用例は次のとおりです。
保持サイクルを回避するために弱く参照されることが多いデリゲートプロパティ、および
ビューコントローラのメインビューのサブビュー/コントロール。これらのビューは既にメインビューによって強く保持されているためです。
アトミック対非アトミックとは、コンパイラーがプロパティ用に合成するゲッターメソッドとセッターメソッドのスレッドセーフを指します。アトミック(デフォルト)は、(ivarにアクセスする前にロックを追加することにより)アクセサーメソッドをスレッドセーフにするようコンパイラーに指示し、非アトミックはその逆を行います。非アトミックの利点は、パフォーマンスがわずかに高いことです。iOSでは、Appleはほとんどすべてのプロパティに非アトミックを使用しているため、一般的なアドバイスは同じことを行うことです。
atomic
保証します。これは、プロパティがすべてあるオブジェクトatomic
が自動的にスレッドセーフであるという意味ではありません。
バルーンに関する強い参照と弱い参照について考えると役立つ場合があります。
少なくとも1人の人がそれに取り付けられた紐を握っている限り、風船は飛んでいきません。紐を持っている人の数が保持数です。誰も弦を握っていないとき、気球は飛び去ります(割り当て解除)。多くの人が同じ風船に紐を付けることができます。強い参照と弱い参照の両方で、参照されたオブジェクトのプロパティを取得/設定し、メソッドを呼び出すことができます。
強い参照は、そのバルーンへの紐を握っているようなものです。風船に取り付けられた紐を握っている限り、飛んでいきません。
弱参照は風船を見ているようなものです。表示、プロパティへのアクセス、メソッドの呼び出しはできますが、そのバルーンへの文字列はありません。ひもを握っている人が手を離すと、風船が飛んでしまい、アクセスできなくなります。
strong
をweak
意味するのかを明確に理解したと思います。
ダミーの答え:-
私はちょうど使用する場所を教えてくれつもりだので、私は、説明は上記の回答に与えられていると思うSTRONG
し、使用する場所WEAK
:
使用Weak
:
-1.デリゲート2.アウトレット3.サブビュー4.コントロールなど
の使用Strong
:-に
含まれていないすべての場所に残りますWEAK
。
強いと弱い、これらのキーワードはObjective-Cのオブジェクト所有権を中心に展開します
オブジェクトの所有権とは何ですか?
ポインター変数は、それらが指すオブジェクトの所有権を意味します。
ポインター変数がオブジェクトを指すときはいつでも、そのオブジェクトには所有者がいて、存続します。これは強いとして知られています参照ます。
変数は、オプションで、それが指すオブジェクトの所有権を取得できません。オブジェクトの所有権を取得しない変数は、弱参照と呼ばれます。
詳細な説明については、こちらをご覧ください@プロパティと属性をわかりやすく説明
ここでは、アップルのドキュメントでさまざまな例を使用して、弱いプロパティと強いプロパティの違いを説明しています。
ここでは、このブログの著者は同じ場所ですべてのプロパティを収集しています。プロパティの特性を比較するのに役立ちます:
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
強い参照と弱い参照を理解するために、以下の例を考えてみましょう。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に達するまで変数は割り当て解除されません。
お役に立てれば。