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

  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,把上面的代码放在一个按钮点击的事件中:



第一次点击后
iOS开发-SDWebImage的回调不addSubView不会调用_第1张图片
看到UIImage无指针存在,所以未触发block,



第二次点击后
iOS开发-SDWebImage的回调不addSubView不会调用_第2张图片

最后可以确定,没调用block是因为没有指针,但是这里两次创建后莫名有了指针,仔细看了下第一次点击的调试信息:
iOS开发-SDWebImage的回调不addSubView不会调用_第3张图片

第一次调用imageView有指针,但是UIImage无指针,第二次调用,两者都有了指针,所以才触发了block,但是个中原因没太懂,有感兴趣的可以来解释下,欢迎加群,一起学习。

你可能感兴趣的:(iOS日常开发)