日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【转】NSMutableArray的正确使用

發(fā)布時(shí)間:2025/3/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】NSMutableArray的正确使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。