iOS开发那些事-性能优化–autorelease的使用问题

转载自:http://2009315319.blog.51cto.com/701759/1132754


 iOS开发那些事-性能优化–autorelease的使用问题
2013-02-07 09:16:16
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://2009315319.blog.51cto.com/701759/1132754

在MRR中释放对象通过release或autorelease消息实现,release消息会立刻使引用计数-1释放,发送 autorelease消息会使对象放入内存释放池中延迟释放,对象的引用计数并不真正变化,而是向内存释放池中添加一条记录,直到当池被销毁前会通知池 中的所有对象全部发送release消息真正将引用计数减少。

由于会使对象延迟释放,除非必须,否则不要使用autorelease释放对象,在iOS程序中默认内存释放池的释放是在程序结束,应用程序入口main.m代码:

 

  
  
  1. int main(int argc, char *argv[]) 
  2.  
  3.  
  4. @autoreleasepool { 
  5.  
  6. return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
  7.  
  8.  

代码被包裹在@autoreleasepool {… }之间,这是池的作用范围,默认是整个应用。如果产生大量对象采用autorelease释放也会导致内存泄漏。那么什么时候autorelease是必须呢?我们看看下面代码:

 

  
  
  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
  2.  
  3.  
  4. static NSString *CellIdentifier = @”CellIdentifier”; 
  5.  
  6. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
  7.  
  8. if (cell == nil) { 
  9.  
  10. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
  11.  
  12.  
  13. NSUInteger row = [indexPath row]; 
  14.  
  15. NSDictionary *rowDict = [self.listTeams objectAtIndex:row]; 
  16.  
  17. cell.textLabel.text =  [rowDict objectForKey:@"name"]; 
  18.  
  19. NSString *imagePath = [rowDict objectForKey:@"image"]; 
  20.  
  21. imagePath = [imagePath stringByAppendingString:@".png"]; 
  22.  
  23. cell.imageView.image = [UIImage imageNamed:imagePath]; 
  24.  
  25. cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
  26.  
  27. return cell; 
  28.  

其中的cell对象不能马上release,我们需要使用它设置表视图画面。autorelease一般应用于为其它调用者提供对象的方法中,对象在该方法不能马上release,而需要延迟释放。

此外,还有一种情况下使用了autorelease,即前文提到的“类级构造方法”:

NSString *message = [NSString stringWithFormat:@"您选择了%@队。", rowValue];

该对象的所有权虽然不是当前调用者,但它是由iOS系统通过发送autorelease消息放入到池中的,当然这一切对于开发者都是不可见的,我们也要注意减少使用这样的语句。

本文出自 “关东升-iOS技术顾问” 博客,请务必保留此出处http://2009315319.blog.51cto.com/701759/1132754


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值