3

自分で保持しているブロックで自分に何かを呼び出すと、通常、警告が表示されます。

[self.someView doSomething:^{
        self.aVar = @"Hello!";
    }];

私がしなければなりません:

        __weak SomeObject *weakSelf = self;
[self.someView doSomething:^{
        weakSelf.aVar = @"Hello!";
    }];

しかし、weakSelfでメソッドを呼び出し、そのメソッドがselfを使用している場合、警告が表示されなくても、保持サイクルが発生しますか?私はこれについて話している:

        __weak SomeObject *weakSelf = self;
[self.someView doSomething:^{
        weakSelf.aVar = @"Hello!";
        [weakSelf aMethod];
    }];

およびaMethodはself

4

2 に答える 2

5

weakSelfyourがblock の外で宣言されている限り、保持サイクルはありません。

ブロック内でオブジェクトを使用すると、保持カウントが暗黙的に増加します。ただし、ではなくaMethodonを呼び出すため、保持カウントは影響を受けません。weakSelfself

于 2013-01-23T12:42:16.457 に答える
2

ブロックの外側にを宣言する必要が__weakあります。self

__weak SomeObject *weakSelf = self;
[self.someView doSomething:^{
     weakSelf.aVar = @"Hello!";
     [weakSelf aMethod];
}];

それ以外の場合、コンパイラはブロックで使用されるため、すでに自己を保持しているはずです。

Beterは、 iOS 5以降のみ__blockであるため、ディレクティブを使用しています。__weak

__block SomeObject *weakSelf = self;
[self.someView doSomething:^{
     weakSelf.aVar = @"Hello!";
     [weakSelf aMethod];
}];

自己を呼び出して保持を引き起こす他のメソッドについて、私はこの動作を見たことがありません。私はいつも__blockそれを捕まえるかもしれないディレクティブを使います。

于 2013-01-23T12:31:21.143 に答える