3

当我在 self 保留的块中调用 self 上的任何内容时,我通常会收到警告:

[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

只要您在您的 block 之外声明weakSelf,就没有保留周期。

在块内使用对象会隐式增加保留计数。但是你会打电话aMethodweakSelf而不是self,所以保留计数不受影响。

于 2013-01-23T12:42:16.457 回答
2

你应该在你__weakself块之外声明:

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

否则编译器将已经保留 self ,因为它与块一起使用。

甚至更好的是使用该__block指令,因为__weak仅适用于 iOS 5 及更高版本。

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

关于另一个调用 self 并导致保留的方法,我从未见过这种行为。我总是使用__block可能会捕获该指令的指令。

于 2013-01-23T12:31:21.143 回答