iphone应用程序内存处理的一点心得与疑问

来源:互联网 发布:淘宝店铺开业时间 编辑:程序博客网 时间:2024/04/27 18:17

    做了一段时间的iphone应用,感触最深的就是对内存问题的处理,这个问题几乎一直是自己在工作中必须要解决的,而最近这些日子则更是选入了内存的迷局之中。而我需要做的就是扒开云雾见天日。

 

    当然内存问题的产生原因是多样的,同时也是我们必须在遇到了某种问题之后,才知道该怎样去处理的,但是,曾经的经验和他人的分享却总是会对我们处理一些问题减少很多的工作量。而今天我想分享的就是一些关于iphone应用程序中遇到的一些内存处理的方法。

 

    首先,单个应用测试没有报内存问题,并不表示在集合中就不会存在内存问题。而且对iphone的内存问题最麻烦的也就在这里,很多单个发布的应用程序,在被整合成为集合之后,内存问题就可能变得极其严重,而且随着集合中加入的新项目的不断增加,内存问题的严重性也迅速增加。所以,这里需要保证的一点就是我们在做单个iphone程序时,应尽量做到:(1)分配和释放一定要对应,比如alloc,retain,copy一定要与release或者autoRelease相对应。这是减少内存问题的很基础的一步,特别是对那些用有alloc功能的函数分配了内存,并做为了return的直的变量,我们也应尽量将其用autoRelease或者其他可行的方式来释放。保证了这一点,整合时,就要轻松的多。(2)对于那些在代码中设置的delegate一定要将其置空。(3)对于NSTimer对象一定要记得关掉,而且最好是采用条件式置空。如图中代码,对timer1先判断其是否可用在决定是否将其置空。(4)对于那些定义的消息中心的数据也要记得进行移除操作。

图  1

 

 

    接下来,最好采用Build and Analyze方式对其进行内存分析,把出现的内存分析中的内存警告也尽可能地解决掉。当然还应当尽可能处理掉所有的编译警告。

    这之后,就是在整合的项目中进行处理了,在这里我们最好已开始就做好如下两部操作。

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    NSLog(@"didReceiveMemoryWarning = %@",[[self class] description]);
    [super didReceiveMemoryWarning];
    ......
    // Release any cached data, images, etc. that aren't in use.
}

 

- (void)dealloc {
    ......
    NSLog(@"dealloc = %@",[[self class] description]);
    [super dealloc];
}

其中的省略号自己去处理,我们只关心两句:NSLog(@"didReceiveMemoryWarning = %@",[[self class] description]);和NSLog(@"dealloc = %@",[[self class] description]);千万别小看了这两句哦,这可以帮助我们在报了内存警告是让我们检测到在那些早已经被释放掉的页面是否留下了未处理的内存问题。以帮我们定位大致目标。

 

    最后我们在必要的时候还可以采用Leaks来帮助我们分析,采用这种比较花时间,所以我们应当尽量在正对某个具体的页面无法处理时,在用他来帮助我们。对于出现在我们代码中的某些具体的问题它甚至可以帮我们定位到具体位置,并标注出出错率。具体使用就不介绍了。

原创粉丝点击