【转】NSMutableArray的正确使用
轉(zhuǎn)自:http://www.cnblogs.com/speeding/archive/2011/09/16/2178355.html
iPhone程序開發(fā)中的內(nèi)存泄漏問題是新手非常頭痛的事情,可能是用C#這類自動垃圾釋放的語言太習(xí)慣了,用xcode中的profile工具查了一下我寫的小程序,內(nèi)存泄漏了一大堆,經(jīng)過一陣子排查,在NSMutableArray中添加對象后不正確維護(hù)對象的引用計(jì)數(shù)是一個主要原因。
在NSMutableArray how to properly addObjects and release這個討論主題中,給出了正確的使用NSMutableArray的步驟,先看他給出的代碼。
NSMutableArray *listData = [[NSMutableArray alloc] init];for (int i = 0; i < 3; i++) { MyData *obj = [[MyData alloc] init];NSString *name = nil; switch (i) {case 0: name = @"Semen"; break; case 1: name = @"Ivan"; break; case 2: name = @"Stepan"; break; default: break; } obj.name = name; [listData addObject: obj];? ? ? ?[obj release];
} [listData release];里面提到了3個問題,翻譯后加上我的理解:
(1)NSMutableArray這個數(shù)組里面包含的對象是什么?是對象的一份拷貝,還只是一個對象的指針?
答:數(shù)組里存放的不是對象的復(fù)本,只是對象的指針。
按以前所學(xué)的C++的思維方式,上面的這句[obj release]是最難理解的,我把obj放在數(shù)組里,數(shù)組里存放的是對象的引用,為什么把obj釋放了?這樣數(shù)組里存放了一個無效的指針?實(shí)際上還是思維方式?jīng)]有轉(zhuǎn)變過來,在Objective-C中,[obj release]只表示obj收到一個release消息,如果它的引用計(jì)數(shù)沒有變成0,它就不會釋放,而在C++中見到這個release就想到了釋放。我們來看一個過程:
MyData *obj = [[MyData alloc] init];?? //obj用了init方法,按照約定,obj的引用計(jì)數(shù)是1,并且要自已來維護(hù)釋放過程
[listData addObject: obj];??? //obj在放到數(shù)組里的時候會自動給obj的引用計(jì)數(shù)加1,這時obj的引用計(jì)數(shù)就是2
[obj release];? //為了維持obj的正常計(jì)數(shù)值,用這條語句讓obj的引用計(jì)數(shù)為1,僅此而已,并沒有被釋放掉!
[listData release]; // 這句會給obj再發(fā)一個release消息,這樣obj的引用計(jì)數(shù)變?yōu)?,銷毀。如果前面那條語句[obj release]不寫,則obj的對象沒有正常釋放掉,就會造成內(nèi)存泄漏!
(2)需要先釋放掉數(shù)組里的所有對象,然后再釋放NSMutableArray對象嗎?
答:不需要。
在釋放NSMutableArray對象里,它自動先給里面的對象發(fā)一個release消息。
(3)正確使用NSMutableArray的步驟是什么? (alloc, init, work, release)
答:
1. NSMutableArray *arr = [[NSMutableArray alloc] init];?? //分配數(shù)組
2. alloc object1.????????????? //分配obj1
3. add object1 to array.??? //把obj1加到數(shù)組中
4.?release object1.?????????? //obj1引用計(jì)數(shù)減1
5. alloc object2.?????????????? //分配obj2
6. add object2 to array.??? //把obj2加到數(shù)組中
7.?release object2.??????????? //obj2引用計(jì)數(shù)減1
8. add as many objects as needed in this manner.? // 按上面的辦法,可以加任意多的對象
8. work with object1.??????? //可以訪問里面的對象
9. remove object1 from array. it will receive a release automatically.? //也可以把obj1移除,這時obj1會自動收到一個release消息
10. [arr release];?? // object2 and others will receive a release.? 最后釋放數(shù)組,數(shù)組里的所有元素也會自動得到一個release消息
上述道理對于NSMutableDictionary類的setObject方法也適用。
轉(zhuǎn)載于:https://www.cnblogs.com/ygm900/archive/2013/01/28/2879984.html
總結(jié)
以上是生活随笔為你收集整理的【转】NSMutableArray的正确使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决 Windows To Go U盘没
- 下一篇: jquery easyUi简单介绍