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