上圖是定義一個不可數對象mutableArray,使用copy來聲明所使用的代碼。
所報的錯如上圖,意爲:在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卻不會。