首先,讓我們看看為什么要使用delegate。
創(chuàng)新互聯(lián)是一家專業(yè)提供信陽企業(yè)網站建設,專注與成都網站制作、網站建設、H5網站設計、小程序制作等業(yè)務。10年已為信陽眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網絡公司優(yōu)惠進行中。
一個典型的ios應用程序會有各種類型的對象:windows,tables,buttons,input boxes等等。在一個特定的應用程序中,你會讓每個對象做特定的事情。比如說當用戶點擊一個按鈕的時候,會執(zhí)行一個特定的操作或者使用一個table顯示特定的數(shù)據。
每個對象實例會有處理 特定 的事情。比如說我們有一個UITableView的實例,我們可能會讓它以特定的方式來顯示特定的 數(shù)據,同樣的,我們對table的每一行進行tapping或者swiping操作的時候,它們也會做出自己特有的事件處理方式。為了避免為達到某一個特定的目的(actions or events)而創(chuàng)建一個子類(如果有多種不同的特定目的就會創(chuàng)建多個子類),你可以寫出響應這些操作或者事件的方法,它們會在這些操作或者事件發(fā)生的時候被調用,為了達到此目的,你只需要給這個對象一個delegate(一個對象)。你可以使一個類作為其他一個對象或者多個對象的delegate。
簡單的說代理就是在類外,讓特定的人對該類做特定的操作的一種實現(xiàn)方法。
開發(fā)中有這么一種情況,詳情頁面 detailsVc 持有 model, 需要將model傳給編輯頁面 editVc ,然后在編輯頁面修改
如果直接使用
會出現(xiàn)這么一種情況: 在 editVc 中修改,不管是否保存,返回?detailsVc 頁面,數(shù)據都會有變化,因為 model 在 editVc 中被修改了!
原因,看指針地址
因為我 model 寫了懶加載,開始有個內存地址,但是賦值之后,內存地址變成了賦值model的內存地址, 也就是傳遞的時候,只是 detailsVc 將持有的 model 的指針,傳給了?editVc 的model,并不是新建了一個值!?editVc 修改model 修改的是指針指向的區(qū)域的值,導致了detailsVc 的 model? 隨著變化,避免這種情況,就需要用到copy.
但是直接這樣寫,會崩潰! 因為調用 copy 方法時,對象會調用?copyWithZone: 方法來實現(xiàn)賦值!
解決辦法: 讓對象實現(xiàn)?NSCopying 協(xié)議
當然,屬性太多,這樣寫也夠累的,可以利用 runtime 完成
ps: ?這里 不能 return self ! copy 我們只是新建了一個來一個個賦值上去, return self 的話,就是把原本的返回,而不是 copy 出來的新對象!
對象:OC對象的本質是結構體,結構體內部是一個指針
iOS對象分為實例對象、類對象、元類對象。