關(guān)于iPhone內(nèi)存管理總結(jié)
iPhone內(nèi)存管理總結(jié)是本文要介紹的內(nèi)容,iPhone里采用Objective-C開發(fā),相對來說,只要遵循了Apple的一些編程規(guī)則,比C++的內(nèi)存管理來的容易些,但是也有很多需要注意的地方,一旦出現(xiàn)內(nèi)存相關(guān)的錯誤,調(diào)試也是個很頭疼的問題。
1. 比如出現(xiàn) EXC_BAD_ACCESS 錯誤,給你的錯誤提示就這個,如何根本沒法知道哪里錯誤了,其實還是有方法知道的,
做如下設(shè)置:
- Project -> Edit active executable ->Argument
添加如下四個參數(shù)
- NSDebugEnabled
- NSZombieEnabled
- MallocStackLogging
- MallocStackLoggingNoCompact
并都設(shè)置為YES。具體如下圖:
這個時候,如果有如下一段代碼:
- //重復(fù)釋放一個變量
- NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
- NSData* data = [NSData dataWithBytes:"asklaskdxjgr" length:12];
- [data release];
- [pool release];
再Debug窗口會有如下的提示
- 2003-03-18 13:01:38.644 autoreleasebug[3939] *** *** Selector 'release'
- ent to dealloced instance 0xa4e10 of class NSConcreteData.
雖然也能大致判斷是哪種類型的變量重復(fù)釋放了,但信息還不夠多,當(dāng)項目大,源碼比較多的時候,也不太方便定位,
在console窗口運行如下命令可以得到更多信息:
- shell malloc_history <pid> <address>"
輸入命令:
- shell malloc_history 3939 0xa4e10
就會出現(xiàn)更多的信息:
- [dave@host193 Frameworks]$ malloc_history 3939 0xa4e10
- Call [2] [arg=32]: thread_a0000dec |0x1000 | start | _start | main |
- +[NSData dataWithBytes:length:] | NSAllocateObject | object_getIndexedIvars |
- malloc_zone_calloc
這個時候就知道具體哪個函數(shù)出先問題了,從這里可以看到main里NSData出現(xiàn)問題了。
2、NSArray等集合類的實用問題。
如下面的代碼
- ReleaseTest* rt = [[alloc] init];
- NSMutableArray *array = [[NSMutableArray alloc] init] ;
- [array addObject: rt];
- ReleaseTest *rt2 = [array objectAtIndex:0];
- [rt2 release];
- [array release];
- [rt release];
就會導(dǎo)致重復(fù)釋放內(nèi)存問題,因為rt2,獲取的是一個對象的指針,如果已經(jīng)釋放了的話,rt在釋放的話,就重復(fù)了,為了遵循誰Init誰Release的原則,rt2就不應(yīng)該Release。
3、init 和 Release 的問題。
凡是對象通過Init的方法生成的對象,都需要自己負責(zé)Release。
凡不是通過Init的方法生成的對象,不需要負責(zé)Release.如[NSString StringWithFormat]方法生成的對象就不需要自己Release,因此自己定義函數(shù),返回一個類的時候,一定要設(shè)置為autoRelease 。這樣調(diào)用的人就不用操心是否需要釋放對象了。
4、AutoReleasePool里***不要將AutoRelease對象賦值給其它對象,否則離開這個作用域后,對象將會Release掉。
小結(jié):關(guān)于iPhone內(nèi)存管理總結(jié)的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助,如果你對iphone開發(fā)很有興趣的話,請到iphone開發(fā)頻道進行更多的學(xué)習(xí)。