我有以下代码来下载图片:
imageRequest = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:magazineItem.contentURL]];
__weak ASIHTTPRequest *weakRequest = imageRequest;
__block typeof (self) bself = self;
[imageRequest setCompletionBlock:^{
if (weakRequest.responseStatusCode == 200) {
bself.imageData = weakRequest.responseData;
[[DataAccessLayer sharedInstance] storeTemporaryContentData:bself.imageData url:magazineItem.contentURL];
bself.contentImage = [UIImage imageWithData:bself.imageData];
if (bself.contentImage != nil) {
if (bself.magazineItem.presentationStyle.intValue != -1) {
[bself setPresentationStyle:bself.magazineItem.presentationStyle.intValue];
}
else {
[bself setPresentationStyleForImage:bself.contentImage];
}
}
else
[bself.delegate contentItemViewUnavailable:bself];
}
else {
[bself.delegate contentItemViewUnavailable:bself];
}
}];
[imageRequest setFailedBlock:^{
if (weakRequest.error.code == 4)
return;
[bself.delegate contentItemViewUnavailable:bself];
}];
[imageRequest startAsynchronous];
虽然我使用__block typeof (self)
标识符将self传递给块,但它仍然会被保留。我也尝试了__weak MyClassName *bself = self;
,它仍然进入保留周期。看来我在这里遗漏了一些东西,任何人都可以告诉我到底我做错了什么?
供参考imageRequest
是我的.m文件类别中的__strong iVar。
提前致谢。
答案 0 :(得分:1)
试
__block __unsafe_unretained typeof (self) bself = self;
- 编辑 -
实际解决问题的评论
访问ivars时,使用bself.property进行操作。如果您直接访问您的ivars,它将获得保留周期。
答案 1 :(得分:1)
根据Generic typeof for weak self references
的建议__weak __typeof__((__typeof__(self))self) bself = self