日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NSMutable属性声明时为什么不能使用copy

發(fā)布時(shí)間:2024/8/26 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NSMutable属性声明时为什么不能使用copy 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。