回答:
特定のファイルに対してARCをオンまたはオフにします。オンの場合、retain
release
autorelease
etc ...を使用できません。代わりにstrong
weak
、プロパティまたは__strong
__weak
変数に使用します(デフォルトは__strong
)。強力は保持と同等ですが、ARCがリリースを管理します。
weakを使用したいのは、保持サイクルを回避したい場合のみです(たとえば、親は子を保持し、子は親を保持するため、どちらも解放されません)。
「フリーブリッジング」部分(からNS
へのキャストCF
)は少しトリッキーです。それでも、手動でCFオブジェクトを管理する必要がCFRelease()
ありCFRetain()
ます。それらをNSオブジェクトに戻すときは、保持カウントについてコンパイラーに通知する必要があります。これにより、コンパイラーは何を行ったかを認識します。
そのすべてがここにあります。
変数のプロパティについて知っている情報は次のとおりです
以下は、上記のすべての属性を見つけることができる詳細な記事のリンクです。ここで最高の答えをくれたすべての人々に感謝します!!
01. 強い(iOS4 =保持) -「もう指さなくなるまでこれをヒープに」と表示されます-言い換えると、「私は所有者です。保持するのと同じように、目標を定める前に割り当てを解除することはできません。 "-オブジェクトを保持する必要がある場合のみ、ストロングを使用します。-デフォルトでは、すべてのインスタンス変数とローカル変数は強力なポインターです。-通常、UIViewControllers(UIアイテムの親)にはstrongを使用します。strongはARCで使用され、オブジェクトの保持カウントを気にする必要がないため、基本的には役立ちます。ARCは、作業が完了すると自動的に解放します。strongキーワードを使用すると、オブジェクトを所有していることになります。
例:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
02. 弱い(iOS4 = unsafe_unretained) -「誰か他の人が強く指摘する限り、これを保持する」-割り当てと同じこと、保持または解放しない-「弱い」参照は、保持しない参照です。-通常、IBOutlets(UIViewControllerの子)にはウィークを使用します。これは、親オブジェクトが存在する限り子オブジェクトが存在する必要があるだけなので機能します。-弱参照は、参照されたオブジェクトをガベージコレクタによるコレクションから保護しない参照です。-弱いは本質的に割り当てられていない、保持されていないプロパティです。オブジェクトが割り当て解除されるときを除いて、ウィークポインターは自動的にnilに設定されます
例:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
説明:BJホーマーに感謝
オブジェクトが犬であり、犬が逃げる(割り当て解除される)ことを望んでいると想像してください。強いポインタは、犬の首輪のようなものです。犬に紐を付けている限り、犬は逃げません。5人が1つの犬にリーシュを取り付けた場合(1つのオブジェクトへの5つの強力なポインタ)、犬は5つすべてのリーシュが外れるまで逃げません。一方、弱いポインタは、犬を指して「見て!犬!」と言う小さな子供たちのようなものです。犬がまだひもにつながっている限り、小さな子供たちは犬を見ることができ、彼らはそれを指さし続けます。しかし、すべての鎖が外れるとすぐに、いくつ小さな子供が指を指していても、犬は逃げます。最後の強いポインター(リーシュ)がオブジェクトを指さなくなるとすぐに、オブジェクトは割り当て解除され、すべての弱いポインターはゼロにリセットされます。弱く使うと?weakを使用したいのは、保持サイクルを回避したい場合のみです(たとえば、親は子を保持し、子は親を保持するため、どちらも解放されません)。
strong=retain
ありassign
、デフォルトとしてラベル付けされていますが、両方にすることはできません。
weak
とのstrong
例を間違えているようです。親がstrong
その子への参照を持っていること(あなたが示しmyButton
たUIViewController
クラスのプロパティとしてweak
)と、子weak
が親への参照を保持していること(つまりviewController
、子クラスのプロパティのように)代わりにveに設定strong
)。たとえば、Matt Neuburgの記事を読むとiOS 7 Programming Fundamentals
、デリゲートをプロパティとして宣言しているクラスは、それを「弱く保つ」ことを示しています。
最後の2つの質問に明確に答えるRobertが参照するドキュメントの部分を呼び出すには、次のようにします。
// 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.
__unsafe_unretained
です。ARCバージョンですassign
。
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
それを回避するには、そのいずれかの週プロパティを使用して、毎週オブジェクトを参照し、参照カウントを増加させないようにする必要があります。