Nip*_*pje 2 exc-bad-access weak-references objective-c objective-c-blocks retain-cycle
我一直在讨论这个问题,因为我不认为我完全理解保留周期.我对此完全陌生,我正在努力了解更多相关信息.
我收到带有以下代码的EXC_BAD_ACCESS消息.
我开始使用weakSelf,因为如果我只使用self.successBLock();我会收到关于保留周期的2个警告.确切的警告是:
Capturing 'self' strongly in this block is likely to lead to a retain cycle
Run Code Online (Sandbox Code Playgroud)
也许我甚至不打算使用弱者,但我对此不太确定.
这是我在块中使用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);
}];
Run Code Online (Sandbox Code Playgroud)
这是我分配块属性的方式:
typedef void (^successBlock)(NSHTTPURLResponse *response, id responseObject);
typedef void (^failureBlock)(NSHTTPURLResponse *response, NSError *error);
@property (nonatomic, copy) successBlock successBlock;
@property (nonatomic, copy) failureBlock failureBlock;
Run Code Online (Sandbox Code Playgroud)
甲__weak参考被设置为nil,如果它指向该对象被释放.因此,如果在Request调用完成块时已经释放了对象,weakSelf则为nil.在这种情况下,weakSelf.successBlock求值为NULL指针,这导致崩溃.
以下模式可以避免此问题:
[_operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
Request *strongSelf = weakSelf;
if (strongSelf) {
strongSelf.successBlock(operation.response, responseObject);
}
} ...
Run Code Online (Sandbox Code Playgroud)
strongSelfnil如果Request对象已被解除分配将会出现.否则,强引用可确保在块执行时不释放对象.
另一方面,如果希望Request对象存在直到调用完成块,则不应使用弱引用.
| 归档时间: |
|
| 查看次数: |
1925 次 |
| 最近记录: |