代理模式是一種消息傳遞方式, 一個完整的代理包括:委托對象,代理對象和協(xié)議.
a. 協(xié)議:用來指定代理雙方可以做什么, 必須做什么
b. 委托對象:根據(jù)協(xié)議指定代理對象需要完成的事, 即調(diào)用協(xié)議中的方法.
c. 代理對象:根據(jù)協(xié)議實現(xiàn)委托對象需要完成的事, 即實現(xiàn)協(xié)議中的方法.
代理屬性使用weak
a. 原因:我們在UITableViewController中, 控制器的view就是UITableView, 這就相當(dāng)于UITableViewController強(qiáng)引用著UITableView(代理對象).
而當(dāng)我們設(shè)置delegate的時候, 一般都是讓UITableViewController成為代理, 這個時候如果代理也使用strong, 就會導(dǎo)致循環(huán)引用, 因此代理得用weak.
b. 為什么不用assign
weak和assign是一種"非擁有關(guān)系"的指針, 通過這兩種修飾符修飾的指針變量都不會改變被引用對象的引用計數(shù). 但是在一個對象被釋放后, weak會自動將指針置nil, 而assign不會. 在OC中, 向nil發(fā)送消息是不會導(dǎo)致崩潰的, 而assign會導(dǎo)致野指針錯誤?unrecognized selector sent to instance
代理與block對比
a. 有多個消息傳遞時, 用delegate實現(xiàn)更合適, 更清晰. block就比較臃腫, 別扭.
b. 從設(shè)計模式的角度來說,?代理更加面向過程, block則更加面向結(jié)果.
c. 性能上來說, block性能消耗略大于delegate, 因為block涉及到棧區(qū)向堆區(qū)拷貝等操作, 時間和空間上的消耗都大于代理. 而代理只是定義了一個方法列表, 在遵守協(xié)議的對象的objc_protocol_list中添加一個節(jié)點(diǎn), 在運(yùn)行時向遵守協(xié)議的對象發(fā)送消息即刻.