2

我一直在为这个问题苦苦挣扎,因为我认为我不完全理解保留周期。我对此完全陌生,我正在尝试更多地了解它。

我收到带有以下代码的 EXC_BAD_ACCESS 消息。

我开始使用weakSelf,因为如果我只使用self.successBLock(); 就会收到2 个关于保留周期的警告。确切的警告是:

Capturing 'self' strongly in this block is likely to lead to a retain cycle

也许我什至不应该打扰使用弱者,但我对此不太确定。

这是我在一个块中使用weakSelf的部分:

__weak Request *weakSelf = self;

[_operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    weakSelf.successBlock(operation.response, responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    weakSelf.failureBlock(operation.response, error);
}];

这就是我分配块属性的方式:

typedef void (^successBlock)(NSHTTPURLResponse *response, id responseObject);
typedef void (^failureBlock)(NSHTTPURLResponse *response, NSError *error);

@property (nonatomic, copy) successBlock successBlock;
@property (nonatomic, copy) failureBlock failureBlock;
4

2 回答 2

9

如果它指向的对象被释放,__weak则设置为引用。nil因此,如果在Request调用完成块时您的对象已经被释放,weakSelf则为nil. 在这种情况下,weakSelf.successBlock计算结果为 NULL 指针,这会导致崩溃。

下面的模式避免了这个问题:

[_operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    Request *strongSelf = weakSelf;
    if (strongSelf) {
        strongSelf.successBlock(operation.response, responseObject);
    }
} ...

strongSelf将是nil如果Request对象已经被释放。否则,强引用确保在块执行时不会释放对象。

另一方面,如果您希望Request对象在调用完成块之前一直存在,那么您不应该使用弱引用。

于 2013-05-08T14:00:53.350 回答
0

weakSelf设置为零时,weakSelf.successBlock很好,但weakSelf.successBlock(operation.response, responseObject)会崩溃。

于 2018-03-06T09:43:40.247 回答