關于iPhone內存管理總結
iPhone內存管理總結是本文要介紹的內容,iPhone里采用Objective-C開發,相對來說,只要遵循了Apple的一些編程規則,比C++的內存管理來的容易些,但是也有很多需要注意的地方,一旦出現內存相關的錯誤,調試也是個很頭疼的問題。
1. 比如出現 EXC_BAD_ACCESS 錯誤,給你的錯誤提示就這個,如何根本沒法知道哪里錯誤了,其實還是有方法知道的,
做如下設置:
- Project -> Edit active executable ->Argument
添加如下四個參數
- NSDebugEnabled
- NSZombieEnabled
- MallocStackLogging
- MallocStackLoggingNoCompact
并都設置為YES。具體如下圖:
這個時候,如果有如下一段代碼:
- //重復釋放一個變量
- 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.
雖然也能大致判斷是哪種類型的變量重復釋放了,但信息還不夠多,當項目大,源碼比較多的時候,也不太方便定位,
在console窗口運行如下命令可以得到更多信息:
- shell malloc_history <pid> <address>"
輸入命令:
- shell malloc_history 3939 0xa4e10
就會出現更多的信息:
- [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
這個時候就知道具體哪個函數出先問題了,從這里可以看到main里NSData出現問題了。
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];
就會導致重復釋放內存問題,因為rt2,獲取的是一個對象的指針,如果已經釋放了的話,rt在釋放的話,就重復了,為了遵循誰Init誰Release的原則,rt2就不應該Release。
3、init 和 Release 的問題。
凡是對象通過Init的方法生成的對象,都需要自己負責Release。
凡不是通過Init的方法生成的對象,不需要負責Release.如[NSString StringWithFormat]方法生成的對象就不需要自己Release,因此自己定義函數,返回一個類的時候,一定要設置為autoRelease 。這樣調用的人就不用操心是否需要釋放對象了。
4、AutoReleasePool里***不要將AutoRelease對象賦值給其它對象,否則離開這個作用域后,對象將會Release掉。
小結:關于iPhone內存管理總結的內容介紹完了,希望通過本文的學習能對你有所幫助,如果你對iphone開發很有興趣的話,請到iphone開發頻道進行更多的學習。