关于iPhone内存管理总结

移动开发 iOS
本文主要介绍的是对iphone内存管理的一个总结,很详细的讲解了内存需要注意的问题并且如何去解决的方法,来看详细内容。

iPhone内存管理总结是本文要介绍的内容,iPhone里采用Objective-C开发,相对来说,只要遵循了Apple的一些编程规则,比C++内存管理来的容易些,但是也有很多需要注意的地方,一旦出现内存相关的错误,调试也是个很头疼的问题。

1. 比如出现 EXC_BAD_ACCESS 错误,给你的错误提示就这个,如何根本没法知道哪里错误了,其实还是有方法知道的,

做如下设置:

  1. Project -> Edit active executable ->Argument  

添加如下四个参数

  1. NSDebugEnabled  
  2. NSZombieEnabled  
  3. MallocStackLogging   
  4. MallocStackLoggingNoCompact 

并都设置为YES。具体如下图:

iPhone内存管理

这个时候,如果有如下一段代码:

  1. //重复释放一个变量   
  2.  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];  
  3.  NSData* data = [NSData dataWithBytes:"asklaskdxjgr" length:12];  
  4.  [data release];  
  5.  [pool release]; 

再Debug窗口会有如下的提示

  1. 2003-03-18 13:01:38.644 autoreleasebug[3939] *** *** Selector 'release'  
  2. ent to dealloced instance 0xa4e10 of class NSConcreteData. 

虽然也能大致判断是哪种类型的变量重复释放了,但信息还不够多,当项目大,源码比较多的时候,也不太方便定位,

在console窗口运行如下命令可以得到更多信息:

  1. shell malloc_history <pid> <address>

输入命令:

  1. shell malloc_history 3939 0xa4e10 

就会出现更多的信息:

  1. [dave@host193 Frameworks]$ malloc_history 3939 0xa4e10  
  2. Call [2] [arg=32]: thread_a0000dec |0x1000 | start | _start | main |  
  3. +[NSData dataWithBytes:length:] | NSAllocateObject | object_getIndexedIvars |  
  4. malloc_zone_calloc   

这个时候就知道具体哪个函数出先问题了,从这里可以看到main里NSData出现问题了。

2、NSArray等集合类的实用问题。

如下面的代码   

  1. ReleaseTest* rt = [[alloc] init];  
  2. NSMutableArray *array = [[NSMutableArray alloc] init] ;  
  3. [array addObject: rt];  
  4. ReleaseTest *rt2 = [array objectAtIndex:0];  
  5.       [rt2 release];     
  6. [array release];  
  7. [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开发频道进行更多的学习。

责任编辑:zhaolei 来源: 博客园
相关推荐

2011-06-03 10:19:59

iphone Objective-

2011-08-17 10:16:35

iPhone应用HTTP请求协议

2020-11-20 11:22:08

Linux

2011-07-21 15:40:24

iPhone 内存管理 对象

2016-01-13 09:19:27

2016-03-03 10:07:39

ios内存管理面试总结

2011-08-18 10:06:10

2010-09-13 08:58:47

自动释放便捷方法内存管理

2019-09-24 08:56:00

内存Redis使用

2012-04-26 21:56:59

iPhone

2011-08-15 10:35:43

iPhone开发Atomicnonatomic

2011-08-15 10:45:11

iPhone开发delegate

2011-07-06 17:40:43

iPhone SDK

2011-07-19 15:33:57

iPhone

2011-08-18 10:39:46

iPhone开发界面

2011-08-12 14:39:00

iPhoneSDK

2011-08-02 17:14:41

iPhone应用 UITableVie

2010-06-07 13:53:06

Linux 内存监控

2011-08-09 17:12:30

iPhoneCFRunLoop

2011-08-05 10:13:45

iPhone开发工具 Cocoa Xcode
点赞
收藏

51CTO技术栈公众号