您的位置:首页 > 移动开发 > IOS开发

iOS开发-SDWebImage的回调不addSubView不会调用

2016-09-23 18:02 316 查看
let lhhImageView = UIImageView()

lhhImageView.sd_setImage(with: URL(string: "http://ww3.sinaimg.cn/mw690/51f76ed7jw1e3ohzmmnffj.jpg")) { (image, error, cacheType, imageURL) in
print("width:" + "\(image?.size.width)" + "height:" + "\(image?.size.height)")
}

self.view.addSubview(lhhImageView)


以上一段代码是swift3.0中获取图片大小的方法,通过SD的回调获取,博主在使用时发现一个bug,如果去掉addSubView这一句代码,回调里面的内容是不会打印的,也就是不执行,但是在OC中是没有问题的,好奇怪啊,具体原因还不清楚,以后找到了会补充,这里暂时贴出来。

下面有人评论说是指针的问题,因为没有addSubView,所以指针指向为nil,查看了苹果关于addSubView的API

-(void)addSubview 官方API说明:
Adds a view to the end of the receiver’s list of subviews.
- Discussion:
This method establishes a strong reference to view and sets its next responder to the receiver, which is its new superview.
Views can have only one superview. If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview.
翻译
添加视图至当前视图的子视图中的最顶层 ,这个方法建立一个强引用至要添加的视图,并设置他的下一响应者到他的父视图. 视图只可以拥有一个父视图.如果视图已经有一个父视图,之前的父视图不再是接受者.这个方法在添加到新的父视图之前会先从旧父视图上移除.


初始化只是创建对象,并无指针,addSubView后由于强引用才有了指针,有了指针block才能生效。(仅仅是猜测)

后来博主发现多次调用会触发这个block,即使没有addSubView,把上面的代码放在一个按钮点击的事件中:

第一次点击后



看到UIImage无指针存在,所以未触发block,

第二次点击后



最后可以确定,没调用block是因为没有指针,但是这里两次创建后莫名有了指针,仔细看了下第一次点击的调试信息:



第一次调用imageView有指针,但是UIImage无指针,第二次调用,两者都有了指针,所以才触发了block,但是个中原因没太懂,有感兴趣的可以来解释下,欢迎加群,一起学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: