0

自動参照カウントを理解する方法は次のとおりです。

オブジェクトがさまざまなクラスによって消費される場合は、「strong」と入力して、他の人がオブジェクトを操作している間、オブジェクトが残り続けるようにする必要があります。

オブジェクトが単にクラスの内部構造である場合、現在のクラスの実装がオブジェクトの処理を完了するとオブジェクトがなくなるため、「weak」タイプにすることができます。

これ以上のものはありますか?

これが私が想像するものの例です:

#import "World.h"
@interface Foo : NSObject
@property (nonatomic, strong) NSArray *barArray;
@property (nonatomic, weak) NSString *bazString;
@end

@implementation Foo
-(void)sendTheArrayIntoTheWorld {
    self.barArray = [NSArray arrayWithObject:@"lonely item"];
    [World takeTheArray:self.barArray]; // array is strong so it can exist indefinitely
}

-(void)useThatString {
    self.bazString = "weak old string"; // string is weak because it should be discarded when it's no longer needed here...
}
@end
4

1 に答える 1

0

これは、ARCがどのように機能するかを正確に示しているわけではありません。要約すると、次のようになります。

  • 強力な参照は、オブジェクトを存続させる唯一のものです
  • strongオブジェクトが存続するには、少なくとも1つの参照が必要です
  • 弱参照はオブジェクトを存続させません-オブジェクトへの弱参照が100あるが、強参照がない場合、オブジェクトは解放されます
  • 他の場所で参照せずにプロパティに値を割り当てると、の場合と同様に、プロパティのweak割り当てがすぐに解除されますbazString。値を割り当てた後でその文字列にアクセスしようとすると(配列などの別のオブジェクトによって所有されている場合を除きますが、実際にはそうではありません)、それがであることがわかりますnil

つまり、デリゲートのように、必ずしも「制御」する必要のないオブジェクトには弱参照を使用する必要があります。デリゲートに強力な参照を使用し、デリゲートが強力な参照を持っている場合、どちらのオブジェクトも割り当てが解除されることはありません。これは保持サイクルと呼ばれます。

使い終わるまでオブジェクトを存続させる必要がある場合は、を使用しますstrong。それ以外の場合は、を使用しますweak

ARCの複雑さと機能について詳しくは、こちらをご覧ください。

于 2012-08-17T23:44:59.710 に答える