如果父類沒有實(shí)現(xiàn)NSCopying協(xié)議,那么子類必須復(fù)制它所繼承的實(shí)例變量,除此之外,它還要復(fù)制子類自身聲明的實(shí)例變量。
針對于繼承父類實(shí)例變量這一部分應(yīng)該采用alloc init方式來實(shí)現(xiàn)NSCopying的功能,因?yàn)榕c繼承相關(guān)的實(shí)現(xiàn)細(xì)節(jié)都被封裝在父類中了。
作者說這樣一來可以用set方法來設(shè)置繼承而來的實(shí)例變量的復(fù)制類型。
但是這里面說得太跳躍了,中間缺乏了過度的細(xì)節(jié)。
假設(shè)作者說的是對的,那么通過alloc init方式應(yīng)該只是完成了指針的指向功能,這樣子類就能指向父類的實(shí)例變量了,然后再通過子類的setter來設(shè)定是深復(fù)制還是淺復(fù)制,我只能這樣理解了。
如果類繼承了NSCopying,那么必須同時(shí)實(shí)現(xiàn)copyWithZone:。
copyWithZone方法會調(diào)用父類的實(shí)現(xiàn)來復(fù)制繼承而來的實(shí)例變量,然后再復(fù)制類自身聲明的實(shí)例變量。
如果父類使用了或者有可能使用了NSCopyObject,并且你還沒有繼承NSCopying,那你就不能使用alloc init來實(shí)現(xiàn)NSCopying行為,必須另想辦法。
NSCopyObject只創(chuàng)建對象的淺復(fù)制,這意味著你通過NSCopyObject獲取一個(gè)對象的時(shí)候,這個(gè)對象并沒有被初始化,復(fù)制過來的指針仍然指向了與被賦值對象中包含的指針相同的內(nèi)存,所以如果你對復(fù)制得到這個(gè)對象進(jìn)行了某些操作,那么被復(fù)制的那個(gè)對象也會受到影響。為了避免這些,你需要首先對復(fù)制過來的對象初始化。
除此之外,復(fù)制得到的對象的引用計(jì)數(shù)也沒有被初始化,你還要對其進(jìn)行初始化。