Objective-Cの弱いプロパティ設定属性と強いプロパティ設定属性の違いは何ですか?
@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;
影響と利点は何ですか?
IOS 4ではウィークが利用できないため、assignを使用する必要があると聞きました。
割り当てに似た弱いですか?
特定のファイルに対してARCをオンまたはオフにします。その上でretain
release
autorelease
などを使用できない場合...代わりに、プロパティにstrong
weak
を使用するか、変数に__strong
__weak
を使用します(デフォルトは__strong
) 。強力は保持と同等ですが、ARCはリリースを管理します。
ウィークを使用したいのは、保持サイクルを回避したい場合だけです(たとえば、親は子を保持し、子は親を保持するため、どちらも解放されません)。
「フリーブリッジ」の部分(NS
からCF
へのキャスト)は少し注意が必要です。 CFオブジェクトのCFRelease()
およびCFRetain()
を手動で管理する必要があります。それらをNSオブジェクトに戻す場合、保持カウントについてコンパイラーに伝える必要があります。
そのすべて ここ 。
変数のプロパティについて私が知っている情報があります
そのため、上記のすべての属性を見つけることができる詳細な記事リンクがあります。ここで最高の回答をしてくれたすべての人に感謝します!!
01。strong(iOS4 = retain)-「これをポイントしなくなるまでヒープに保持する」-つまり「私は所有者です。retainと同じように狙いを定める前にこれを解除することはできません。」-オブジェクトを保持する必要がある場合にのみ、strongを使用します。 -デフォルトでは、すべてのインスタンス変数とローカル変数は強力なポインターです。 -UIViewControllers(UIアイテムの親)には通常、strongを使用します-ARCではstrongが使用され、オブジェクトの保持カウントを心配する必要がないため、基本的に役立ちます。 ARCは、作業が完了すると自動的に解放します。strongキーワードを使用することは、オブジェクトを所有していることを意味します。
例:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
02。weak(iOS4 = unsafe_unretained)-「他の誰かが強く指し示す限りこれを保持する」-assignと同じこと、no保持または解放-「弱い」参照は、保持しない参照です。 -IBOutlets(UIViewControllerのChilds)には通常、weakを使用します。これは、親オブジェクトが存在する場合にのみ子オブジェクトが存在する必要があるため機能します。 -弱参照とは、参照オブジェクトをガベージコレクターによるコレクションから保護しない参照です。 -弱は本質的に割り当てられた、保持されないプロパティです。オブジェクトの割り当てが解除された場合を除き、ウィークポインターは自動的にnilに設定されます
例:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
説明: BJ Homerに感謝
私たちのオブジェクトが犬であり、犬が逃げる(割り当て解除される)ことを想像してください。強いポインターは犬の綱のようなものです。リーシュを犬に取り付けている限り、犬は逃げません。 5人が1本の犬に綱を付けた場合(1つのオブジェクトへの5つの強力なポインター)、5本の綱すべてが切り離されるまで犬は逃げません。一方、弱いポインターは、小さな子供が犬を指差して、「見て!犬!」と言っているようなものです。犬がひもにつながれている限り、小さな子供たちは犬を見ることができ、犬はそれを指し示します。しかし、すべてのひもが外されるとすぐに、犬はそれを何人の小さな子供が指していても逃げます。最後の強いポインター(リーシュ)がオブジェクトをポイントしなくなるとすぐに、オブジェクトの割り当てが解除され、すべての弱いポインターがゼロになります。弱いときは?ウィークを使用したいのは、保持サイクルを回避したい場合だけです(たとえば、親は子を保持し、子は親を保持するため、どちらも解放されません)。
Robertが参照しているドキュメントの最後の2つの質問に明示的に答えている部分を呼び出すには:
// The following declaration is similar to "@property(assign) MyClass *myObject;"
// except that if the MyClass instance is deallocated,
// the property value is set to nil instead of remaining as a dangling pointer.
@property(weak) MyClass *myObject;
これは、ゼロ調整弱参照と呼ばれます。 __unsafe_unretainedを使用して、弱参照をゼロ化しない弱参照を作成できますが、名前が示すように、これは一般的に推奨されません。
また、ドキュメント内:
Weak references are not supported in Mac OS X v10.6 and iOS 4.
WEAKプロパティの明確な使用法は次のとおりです。
Any control whose properties we need to change(eg:text of a label) is declared weak and as below:
@property(nonatomic,weak) IBOutlet Type *name;
Eg: @property(nonatomic,weak) IBOutlet UILabel *myLabel;
例を挙げてさらに詳しく説明します(上記の回答はすでに素晴らしいです)。
2つのクラスAとBがあります
//A.h
#import <Foundation/Foundation.h>
#import "B.h"
@interface A : NSObject
@property (nonatomic, strong) B *objB;
@end
@implementation A
//
@end
//B.h
#import <Foundation/Foundation.h>
#import "A.h"
@interface B : NSObject
@property strong text(nonatomic, strong) A *objA;
@end
@implementation B
//
@end
and in main
#import "B.h"
#import "A.h"
{
A *obja =[[A alloc]init];
B *objb =[[B alloc]init];
A.objB=objb;
B.objA=obja;
}
上記のコードは両方とも強い型a --------> b ---------> aであるため、保持サイクルを生成します
それを回避するには、そのオブジェクトの週プロパティを使用して、オブジェクトを参照し、参照カウントを増加させないようにする必要があります。