NSMutableArray使用copy聲明所產生內存泄漏的問題

NSMutableArray問題
上圖是定義一個不可數對象mutableArray,使用copy來聲明所使用的代碼。

1
所報的錯如上圖,意爲:在NSArray這樣的類型中,找不到removeObject:方法。爲什麼會出現這樣的錯誤呢?相反,如果使用strong來聲明的話就不會出錯。

綜合上訴,通過思考會明顯看出有兩個問題:

1、爲什麼使用copy會報錯,使用strong卻不會。

2、爲什麼報錯會報在NSArray中,無法找不到removeObject

根據這兩個問題,我們就可以思考,修飾詞copy和strong有什麼區別呢?爲什麼copy後報錯會是NSArray,無法找到removObject呢,是不是copy時生成了NSArray?所以解決這兩個問題,我們就能知道爲什麼不能用copy這個關鍵字了
我們做iOS開發的大致都對這個瞭解,再科普一下這兩個的關係和區別。

copy和strong的區別:copy賦值時會開闢一個新的內存區域,而 strong 則不會。使用 copy 可以防止不可變的屬性被賦值的是可變的數據時,因可變數據的改變而改變屬性的值

self.mutableArray = [[NSMutableArray alloc] initWithArray:@[@"1",@"2",@"3"]];

這句代碼開闢內存空間賦值給self.mutableArray. 你用self.array = 是通過setter方法來給mutableArray賦值,而你又給這個setter方法設置copy(_mutableArray = [mutableArray copy]),而經過copy生成的mutableArray指針指向的是一個不可變數組,這時你在調用removeObject或add方法,肯定會出問題,並且會報出上面所出現的錯誤“unrecognized selector sent to instance”。所以我們應該知道爲什麼用copy會產生內存泄漏的問題,而strong卻不會。

發佈了30 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章