5

次のARC対応コードがあります

@property (nonatomic, weak) NSArray *a;
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.a = @[@1, @2];
    NSLog(@"ab is %@", self.a); //prints details of array
    // Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{

    [super didReceiveMemoryWarning];
    for (id element in self.a) { //empty here
        NSLog(@"blah");
    }
    // Dispose of any resources that can be recreated.
}

を使ったのはここだけself.aです。これは、問題の 1 つをデバッグするために作成したテスト プログラムです。

メモリ警告をシミュレートするとself.a消えますか? なんで?

4

2 に答える 2

12

それを理解するには、参照カウントを理解する必要があります。Objective-C では、すべてのオブジェクトに参照カウント (つまり、オブジェクトへの強い参照の数) があります。強い参照がない場合、参照カウントは 10になり、オブジェクトの割り当てが解除されます。

self.a = @[@1, @2];autoreleased を作成しNSArray(後の段階で自動的にリリースされることを意味します)、それを に割り当てself.aます。autoreleasepool が排出されると、その配列の参照カウントは0(他に強い参照がないと仮定して) になり、割り当てが解除されます。self.a弱い変数であることは、自動的に nil に設定されます。

を使用[[NSArray alloc] init]して配列を初期化し、それをウィーク ポインターに割り当てると、オブジェクトは割り当ての直後に解放されます。で、NSLogaなりますnil

__weak NSArray* a = [[NSArray alloc] initWithObjects:@"foo", @"bar", nil];
NSLog(@"%@", a);

Xcode 4.6 では、コンパイラは後者のケースについて警告します。

于 2013-03-28T04:43:00.213 に答える
0

弱い参照は、それが指しているオブジェクトの存続期間を延長せず、自動的に nil になります。

ARCが新しいライフタイム修飾子を導入

参照カウントを 1 増やすことはありません。そのオブジェクトの所有者にはなりませんが、参照を保持するだけです。オブジェクトの参照カウントが 0 になった場合、ここでそのオブジェクトを指している場合でも、メモリから割り当てが解除されます。

(ノンアトミック、コピー、ストロング、ウィーク)

したがって、ここでは弱いオブジェクトに、受信値を保持せずに割り当てます。また、オブジェクトの有効期間を制御できないため、弱く参照しているオブジェクトは、少なくとも 1 つの他のオブジェクトが強い参照を保持しているため、存続します。それがなくなると、オブジェクトは破棄され、weak プロパティは一度使用すると自動的に nil に設定されます。

于 2013-03-28T04:45:19.460 に答える