0c-35-自动释放池使用注意

简介:
复制代码
1、autorelease使用注意

1)并不是放到自动释放池中,都会自动加入到自动释放池

1.1) 因为没有调用autorelease方法,所以对象没有加入到自动释放池.

int main(){
 @autoreleasepool{
  Student *s = [[Student alloc] init];
  [s release]; // 正常释放
 }
return 0;
}

1.2)在自动释放池的外部发送autorelease不会被加入到自动释放池中。

int main(){
 @autoreleasepool{

 }
 // 发送autorelease消息的对象,放到制动释放池外部
 // 此时无法被自动释放
Student *s = [[[Student alloc] init] autorelease];
return 0;
}

1.3)不管对象是在自动释放池里创建,还是自动释放池外创建,只要在自动释放池内写1个[s autorelease];s就会被放到自动释放池中,注意:autorelease是一个方法,且只有在自动释放池中使用才有效。
int main(){
   // 不管在自动释放池内部还是外部创建
   Student *s = [[Student alloc] init];
   @autoreleasepool{
       [s autorelease]; // 此时s加入到释放池
 }
 return 0;
}

2)自动释放池的嵌套使用
自动释放池是栈结构。
栈:先进后出。后进先出, 
复制代码

复制代码
int main(int argc, const char * argv[]) {
@autoreleasepool {
           // 第一个池子,里面创建no的1学生
            Student *s = [[[Student alloc] init] autorelease];
            s.no = 1;
    @autoreleasepool {
            // 第二个池子,里面创建no2的学生
               Student *s2 = [[[Student alloc] init] autorelease];
               s2.no = 2;
        @autoreleasepool {
            // 第二个池子,里面创建no3的学生
                    Student *s3 = [[[Student alloc] init] autorelease];
                    s3.no = 3;
        }
    }
}
return 0;
}
复制代码
复制代码
释放顺序:s3,s2,s1
3)自动释放池中不适合放占用内存空间较大的对象
1> 尽量避免对大内存使用该方法,对于这种延迟释放机制,尽量少用
2> 不要把大量循环操作放到同1个自动释放池中,这样会造成内存峰值的上升。

2、autorelease错误用法
1、连续调用多次autorelease。
  @autoreleasepool {
      Student *s = [[[Student alloc] autorelease] autorelease];// 调用了两次autorelease,对象过度释放。
  }

2、对象创建在释放池外,但是在释放池内进行autorelease后,在释放池外,又进行了release。
   int main(int argc, const char * argv[]) {
      Student *s = [[Student alloc] init];
      @autoreleasepool {
         [s autorelease];// 此时出池子后,对象可以被释放
      }
         [s release];// 对象被释放后再次调用释放,会出错。
    return 0;
 }

3、alloc之后调用了autorelease,之后又调用release。
  int main(int argc, const char * argv[]) {
     @autoreleasepool {
        Student *s = [[[Student alloc] init] autorelease];
        [s release];
     }
    return 0;
}

4、alloc之后调用release。

int main(int argc, const char * argv[]) {

   @autoreleasepool {
 // 因为release没有返回值,所以这样调用是错误的。
      Student *s = [[[Student alloc] init] release];
   }

  return 0;
}
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5315597.html,如需转载请自行联系原作者

相关文章
|
6天前
|
人工智能 运维 安全
|
4天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
558 17
|
11天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
910 109
|
5天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。