当前位置: 首页 > news >正文

OC-ARC

一、 基本简介

  • ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切
  • ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化

二、基本原理

1.  规则

ARC 的规则非常简单:只要还有一个强指针变量指向对象,对象就会保持在内存中

2.  强指针和弱指针

  • 默认所有实例变量和局部变量都是Strong指针
  • 弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误

三、使用注意

  • 不能调用release、retain、autorelease、retainCount
  • 可以重写dealloc,但是不能调用[super dealloc]
  • @property : 想长期拥有某个对象,应该用strong(相当于retain),其他对象用weak(相当于assign)
  • 其他基本数据类型依然用assign
  • 两端互相引用时,一端用strong、一端用weak
  • 错误写法:_weak Person *p = [[Person alloc] init];
/*
 1.autorelease的基本用法
 1> 会将对象放到一个自动释放池中
 2> 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
 3> 会返回对象本身
 4> 调用完autorelease方法后,对象的计数器不变
 
 2.autorelease的好处
 1> 不用再关心对象释放的时间
 2> 不用再关心什么时候调用release
 
 3.autorelease的使用注意
 1> 占用内存较大的对象不要随便使用autorelease
 2> 占用内存较小的对象使用autorelease,没有太大影响
 
 
 4.错误写法
 1> alloc之后调用了autorelease,又调用release
 @autoreleasepool
 {
    // 1
    Person *p = [[[Person alloc] init] autorelease];
 
    // 0
    [p release];
 }
 
 2> 连续调用多次autorelease
 @autoreleasepool
 {
    Person *p = [[[[Person alloc] init] autorelease] autorelease];
 }
 
 5.自动释放池
 1> 在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)
 2> 当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池
 
 
 6.自动释放池的创建方式
 1> iOS 5.0前
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
 [pool release]; // [pool drain];
 
 
 2> iOS 5.0 开始
 @autoreleasepool
 {
    
 }
 */

#import <Foundation/Foundation.h>
#import "Person.h"

int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
    Person *pp = [[[Person alloc] init] autorelease];
    
    [pool release]; // [pool drain];
    
    @autoreleasepool
    {
        // 1
        Person *p = [[[[Person alloc] init] autorelease] autorelease];
        
        // 0
        // [p release];
    }
    return 0;
}


void test()
{
    @autoreleasepool
    {// { 开始代表创建了释放池
        
        // autorelease方法会返回对象本身
        // 调用完autorelease方法后,对象的计数器不变
        // autorelease会将对象放到一个自动释放池中
        // 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
        Person *p = [[[Person alloc] init] autorelease];
        
        p.age = 10;
        
        @autoreleasepool
        {
            // 1
            Person *p2 = [[[Person alloc] init] autorelease];
            p2.age = 10;
            
        }
        
        Person *p3 = [[[Person alloc] init] autorelease];
        
    } // } 结束代表销毁释放池
}

 

转载于:https://www.cnblogs.com/IDRI/p/4983097.html

相关文章:

  • [BetterExplained]书写是为了更好的思考(转载)
  • leetcode Merge Two Sorted Lists
  • How to install sharepoint server 2010 sp2 in window 7 x64
  • 【ECJTU_ACM 11级队员2012年暑假训练赛(8) - K - A short problem】
  • 优龙FS2410开发板学习过程遇到问题总结
  • linux信号量
  • android:supportsRtl=true
  • Linux安装卸载软件
  • Swift是花拳绣腿吗?——谈谈开发语言与程序员的职业发展
  • sqlite打印结果集函数
  • Linux内核中的时间
  • 写好注释的方法小结
  • 如何把Access中数据导入Mysql中 (转)
  • 隐藏windows7/8“卸载或更改程序”里的软件
  • C# 5.0中新增特性
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • bootstrap创建登录注册页面
  • C++入门教程(10):for 语句
  • Cumulo 的 ClojureScript 模块已经成型
  • FineReport中如何实现自动滚屏效果
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Linux快速复制或删除大量小文件
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Python学习之路16-使用API
  • 初识 webpack
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 简析gRPC client 连接管理
  • 聊聊flink的TableFactory
  • 面试总结JavaScript篇
  • 前端知识点整理(待续)
  • 通过npm或yarn自动生成vue组件
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • linux 淘宝开源监控工具tsar
  • MPAndroidChart 教程:Y轴 YAxis
  • 进程与线程(三)——进程/线程间通信
  • 我们雇佣了一只大猴子...
  • #《AI中文版》V3 第 1 章 概述
  • #QT(一种朴素的计算器实现方法)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $().each和$.each的区别
  • (function(){})()的分步解析
  • (LeetCode C++)盛最多水的容器
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (solr系列:一)使用tomcat部署solr服务
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (六)Hibernate的二级缓存
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)Sql Server 保留几位小数的两种做法
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .describe() python_Python-Win32com-Excel