NSMutable屬性聲明時為什麼不能使用copy,nsmutablecopy

來源:互聯網
上載者:User

NSMutable屬性聲明時為什麼不能使用copy,nsmutablecopy

在iOS開發裡面我們經常會進行NSMutable(可變類型的類,常用的如NSMutableString,NSMutableArray,NSMutableDictionary,NSMutableData等)屬性的聲明,在聲明時我們都知道要使用strong(強引用)來進行標識,但是很多人不知道為什麼不能使用copy來進行標識,下面我們展開討論一下:

1.為什麼不能使用copy:

總所周知,所有的可變類都是繼承於非可變類的,屬於可變類的子類,拿NSMutableString類來舉例,大家進入到NSMutableString類的.h檔案可以看到它是繼承於NSString類的,而且NSMutableString類並沒有重寫NSString類的copy方法,所以我們如果聲明NSMutableString類屬性時使用了copy進行標識,在我們對這個屬性進行賦值時,調用的其實是NSString類的copy方法,拿到的執行個體對象其實是一個NSString的執行個體,而不是一個NSMutableString的執行個體,下面使用代碼給大家驗證一下:

 

從輸出結果可以看到tempStr是一個NSMutableString對象,使用strong修飾聲明的屬性str只是對tempStr對象添加了一個引用計數,並沒有產生新的對象執行個體,所以tempStr和str的class方法其實調用的是同一個對象的方法,所以輸出的結果是一樣的。而使用copy修飾聲明的屬性mstr在被賦值時,會調用tempStr對象的copy方法產生一個新的對象,而且從輸出結果可以看到這個對象是NSString對象。

綜上所述,NSMutable屬性聲明時不能使用copy進行修飾是因為NSMutable類並沒有重寫非可變類的copy方法,給屬性賦值時,調用的是父類的copy方法,得到的對象是一個非可變對象。

2.使用了copy會怎樣:

由於給對象賦值時得到的對象是非可變對象,所以我們使用該屬性調用可變對象的特有方法時程式會奔潰(因為對象根本響應不了該方法),下面我們同樣適用代碼給大家驗證一下:

tempStr對象和str屬性的replaceCharactersInRange方法均執行成功,但是程式運行到[self.mstr replaceCharactersInRange:NSMakeRange(0, 1) withString:@""]這句代碼時奔潰了,所以這個問題對程式的影響還是很大的,而且這個的bug很難被找出來,所以在聲明NSMutable屬性時一定要多加註意。

第一次寫部落格,希望對大家有所協助,博文中有什麼不足的地方希望各位大牛可以幫忙指出,大家一起交流進步

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.