iOS 代理设计模式
在項(xiàng)目中經(jīng)常會(huì)用到代理的設(shè)計(jì)模式,這是iOS中一種消息傳遞的方式,也可以通過這種方式傳遞一些參數(shù).
在項(xiàng)目中,剛開始我是用一些代理來傳遞參數(shù)的,但是慢慢覺得代理的代碼比較block多,所以就更多的使用了block.
前幾天突然想到了代理的設(shè)計(jì)模式,回頭翻看了下,
protocol--協(xié)議
協(xié)議是公共的定義,如果只是某個(gè)類使用,我們常做的就是寫在某個(gè)類中。如果是多個(gè)類都是用同一個(gè)協(xié)議,建議創(chuàng)建一個(gè)Protocol文件,在這個(gè)文件中定義協(xié)議。遵循的協(xié)議可以被繼承,例如我們常用的UITableView,由于繼承自UIScrollView的緣故,所以也將UIScrollViewDelegate繼承了過來,我們可以通過代理方法獲取UITableView偏移量等狀態(tài)參數(shù)。
協(xié)議可以繼承其他協(xié)議,并且可以繼承多個(gè)協(xié)議,在iOS中對(duì)象是不支持多繼承的,但是協(xié)議可以.
代理對(duì)象 --
代理對(duì)象在很多情況下其實(shí)是可以復(fù)用的,可以創(chuàng)建多個(gè)代理對(duì)象為對(duì)個(gè)委托方服務(wù).
代理內(nèi)存管理
delegate的屬性都是用weak,因?yàn)閟trong類型的指針會(huì)造成強(qiáng)引用,必定會(huì)影響一個(gè)對(duì)象的生命周期,這也就會(huì)形成循環(huán)引用.
weak和assign是一種"非擁有關(guān)系"的指針,通過這兩種修飾符修飾的指針變量,都不會(huì)改變被引用對(duì)象的引用計(jì)數(shù).但是在一個(gè)對(duì)象被釋放后,weak會(huì)自動(dòng)將指針指向nil,而assign則不會(huì).在iOS中,向nil發(fā)送消息時(shí)不會(huì)導(dǎo)致崩潰的,所以assign就會(huì)導(dǎo)致野指針的錯(cuò)誤unrecognized selector sent to instance。
?
代理和block的選擇
在多個(gè)消息傳遞時(shí)應(yīng)該使用delegate.這個(gè)時(shí)候的block不便于維護(hù)而且臃腫.
一個(gè)委托對(duì)象的代理屬性只能有一個(gè)代理對(duì)象,如果想要委托對(duì)象調(diào)用多個(gè)代理對(duì)象的回調(diào)應(yīng)該用block.
代理是可選的,而block在方法調(diào)用的時(shí)候只能通過將某個(gè)參數(shù)傳遞一個(gè)nil進(jìn)去.
有時(shí)候需要用到外面的屬性應(yīng)該用block,代理是另外的方法,屬性不容易傳遞
轉(zhuǎn)載于:https://www.cnblogs.com/ritian/p/6269863.html
總結(jié)
以上是生活随笔為你收集整理的iOS 代理设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序正式上线 可置于聊天窗口顶部
- 下一篇: 小球大作战-搜索优化