我下载图像时发现内存泄漏,但我从来没有发现任何循环保留吗?
代码:
class DetailVCHeaderPictuerScrollViewCell: UICollectionViewCell {
...
var item: DetailVCHeaderPictuerScrollViewCellItem! {
didSet {
var ip = indexPath
// memory was leak on the follow line
DownloadImgOnMain(item.img, { [weak self](img, finished) -> Void in
if self == nil { return }
if ip == self?.indexPath {
self?.imageV.image = img
}
})
}
}
...
}
func DownloadImgOnMain(url: String, callback: (img: UIImage?, finished: Bool)->Void) {
SDWebImageDownloader
.sharedDownloader()
.downloadImageWithURL(NSURL(string: url)!,
options: SDWebImageDownloaderOptions.allZeros,
progress: nil) { (img, data, err, finished) -> Void in
DispatchBlockOnMainSafe({ …Run Code Online (Sandbox Code Playgroud) 关于教程promgrammingWithObjectiveC.
在处理返回块或将其他块作为参数的块时,自定义类型定义特别有用.请考虑以下示例:
void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
...
return ^{
...
};
};
Run Code Online (Sandbox Code Playgroud)
complexBlock变量引用一个块,该块将另一个块作为参数(aBlock)并返回另一个块.
重写代码以使用类型定义使这更具可读性:
typedef void (^XYZSimpleBlock)(void);
XYZSimpleBlock (^betterBlock)(XYZSimpleBlock) = ^ (XYZSimpleBlock aBlock) {
...
return ^{
...
};
};
Run Code Online (Sandbox Code Playgroud)
我的重写代码:
但我无法理解源代码:
void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
...
return ^{
...
};
}
Run Code Online (Sandbox Code Playgroud)
据我所知,它应该是:
(void (^) (void)) (^complexBlock) (void (^)(void) = ^ (void (^aBlock)(void)) {
...
return ^{
...
};
};
Run Code Online (Sandbox Code Playgroud)