NSMutable属性声明时为什么不能使用copy
在iOS開發(fā)里面我們經(jīng)常會(huì)進(jìn)行NSMutable(可變類型的類,常用的如NSMutableString,NSMutableArray,NSMutableDictionary,NSMutableData等)屬性的聲明,在聲明時(shí)我們都知道要使用strong(強(qiáng)引用)來進(jìn)行標(biāo)識(shí),但是很多人不知道為什么不能使用copy來進(jìn)行標(biāo)識(shí),下面我們展開討論一下:
1.為什么不能使用copy:
總所周知,所有的可變類都是繼承于非可變類的,屬于可變類的子類,拿NSMutableString類來舉例,大家進(jìn)入到NSMutableString類的.h文件可以看到它是繼承于NSString類的,而且NSMutableString類并沒有重寫NSString類的copy方法,所以我們?nèi)绻暶鱊SMutableString類屬性時(shí)使用了copy進(jìn)行標(biāo)識(shí),在我們對這個(gè)屬性進(jìn)行賦值時(shí),調(diào)用的其實(shí)是NSString類的copy方法,拿到的實(shí)例對象其實(shí)是一個(gè)NSString的實(shí)例,而不是一個(gè)NSMutableString的實(shí)例,下面使用代碼給大家驗(yàn)證一下:
?
從輸出結(jié)果可以看到tempStr是一個(gè)NSMutableString對象,使用strong修飾聲明的屬性str只是對tempStr對象添加了一個(gè)引用計(jì)數(shù),并沒有產(chǎn)生新的對象實(shí)例,所以tempStr和str的class方法其實(shí)調(diào)用的是同一個(gè)對象的方法,所以輸出的結(jié)果是一樣的。而使用copy修飾聲明的屬性mstr在被賦值時(shí),會(huì)調(diào)用tempStr對象的copy方法產(chǎn)生一個(gè)新的對象,而且從輸出結(jié)果可以看到這個(gè)對象是NSString對象。
綜上所述,NSMutable屬性聲明時(shí)不能使用copy進(jìn)行修飾是因?yàn)镹SMutable類并沒有重寫非可變類的copy方法,給屬性賦值時(shí),調(diào)用的是父類的copy方法,得到的對象是一個(gè)非可變對象。
2.使用了copy會(huì)怎樣:
由于給對象賦值時(shí)得到的對象是非可變對象,所以我們使用該屬性調(diào)用可變對象的特有方法時(shí)程序會(huì)奔潰(因?yàn)閷ο蟾卷憫?yīng)不了該方法),下面我們同樣適用代碼給大家驗(yàn)證一下:
tempStr對象和str屬性的replaceCharactersInRange方法均執(zhí)行成功,但是程序運(yùn)行到[self.mstr replaceCharactersInRange:NSMakeRange(0, 1) withString:@""]這句代碼時(shí)奔潰了,所以這個(gè)問題對程序的影響還是很大的,而且這個(gè)的bug很難被找出來,所以在聲明NSMutable屬性時(shí)一定要多加注意。
第一次寫博客,希望對大家有所幫助,博文中有什么不足的地方希望各位大牛可以幫忙指出,大家一起交流進(jìn)步
?
轉(zhuǎn)載于:https://www.cnblogs.com/JohnWangYe/p/6972222.html
總結(jié)
以上是生活随笔為你收集整理的NSMutable属性声明时为什么不能使用copy的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVC思想
- 下一篇: 备忘录 | 当我每晚闲暇时我在干什么(2