復習 copy與retain的區(qū)別:
copy是創(chuàng)建一個新對象,retain是創(chuàng)建一個指針,引用對象計數(shù)加1。Copy屬性表示兩個對象內(nèi)容相同,新的對象retain為1 ,與舊有對象的引用計數(shù)無關(guān),舊有對象沒有變化。copy減少對象對上下文的依賴。
retain屬性表示兩個對象地址相同(建立一個指針,指針拷貝),內(nèi)容當然相同,這個對象的retain值+1也就是說,retain 是指針拷貝,copy 是內(nèi)容拷貝。
1. 系統(tǒng)的非容器類對象
這里指的是NSString,NSNumber等等一類的對象。
對于系統(tǒng)的非容器類對象,我們可以認為,如果對一不可變對象復制,copy是指針復制(淺拷貝)和mutableCopy就是對象復制(深拷貝)。如果是對可變對象復制,都是深拷貝,但是copy返回的對象是不可變的。
2. 系統(tǒng)的容器類對象?
指NSArray,NSDictionary等。對于容器類本身,上面討論的結(jié)論也是適用的,需要探討的是復制后容器內(nèi)對象的變化。
在OC中,所有Foundation中的容器類,分為可變?nèi)萜骱筒豢勺內(nèi)萜鳎鼈兊目截惗际菧\拷貝。
容器拷貝的難點在于可變性的變化。容器有兩種方法:copy和mutableCopy,再次強調(diào)這兩者都是淺拷貝。它們的區(qū)別在于,返回值是否是可變的。前者返回不可變?nèi)萜鳎笳叻祷乜勺內(nèi)萜鳌?b>(摘自)