swift- protocol weak的问题

就像MVC是苹果提供的UI框架里 自带的设计模式一样,代理设计模式也充斥着苹果的编程里,抛开系统框架不说,当我们要自己写一个代理的时候大家都知道在RAC下有个循环应用问题;即A类 持有B类,B类持有一个代理,这个代理指向A类,这个时候就形成了循环,为了避免这个问题,我们会有意识的把代理设置成weak,这样就能保证A类和B类的正确释放。

那么问题来了:

weak 修饰 protocal报错

大概的意思就是说 swift的协议考虑到可能用 struct、enum准守的可能性,不能使用weak修饰,这是swift强大的面向协议编程理念的基础,这个时候大家肯定就会想到转换成OC的protocol 在协议前面加上 @objc

使用OC版协议

这往往的确能解决问题 但是 swift 作为一个独立的语言这么依靠OC肯定是不可能的,于是有了

swift 只有class准守的协议

这样这个协议就只能由 class 准守了,这就相当于OC里的协议了,也是大家最熟悉的协议,就是用来解决class之间的种种问题的协议了,运用老的编程思路和思想这个问题似乎已经解决了,但还差了点,swift的面相协议编程思想不能这么弱,这个时候我们有期望struct,或者enum来准守协议怎么办

enum准守报错


struct准守报错

回到 我们解决循环引用的问题上来[A持有属性B(持有属性delegate:A)],我们是因为三个引用循环里需要其中一个引用需要用weak打破,自然在代理用weak是经过前人深思熟虑和实践的结果,如果不在此处使用,那么就只能是在A持有B这个地方了,那么为什么不这么做呢,那是因为A持有B是一个明显的上下级或者父子级关系,所以 往往A必须是到B是一定存在的我们才能做很多事情,但是 如果这是个视图那么情况就很不同了,首先 当一个视图被add的时候就一定会有个强引用, 所以 子视图属性完全可以用weak修饰,如果你是用的storyboard/xib这样的东西 就更不用担心了,当你拖拽到代码里的时候 会看见他是用weak修饰的,因为storyboard/xib添加的视图都是已经被强引用了的。

因此当我们碰见protocol时就需要更仔细的思考了,如果这是一个修饰class的协议还是一个objc协议,还是一个可以修饰enum/struct的协议,来使用不同的方式完成我们的程序。

你可能感兴趣的:(swift- protocol weak的问题)