autorelease(IOS开发)的原理详解

2023-11-07

转载出处:http://tieba.baidu.com/p/3427605546

转载出处:http://blog.csdn.net/c395565746c/article/details/7613814

当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。


1. ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.
2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个部分后面会详细说到.
3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.


NSAutoreleasePool详解:
1. NSAutoreleasePool实际上是个对象引用计数自动处理器。NSAutoreleasePool可以同时有多个,它的组织是个栈,总是存在一个栈顶pool,也就是当前pool,每创建一个pool,就往栈里压一个,改变当前pool为新建的pool,然后,每次给pool发送drain消息,就弹出栈顶的pool,改当前pool为栈里的下一个 pool。


2. 在程序的入口main函数就调用NSAutoreleasePool,这样保证程序中不调用NSAutoreleasePool,但在退出时自动释放。新开线程最好实现NSAutoreleasePool


3. NSAutoreleasePool的管理范围是在NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];与[pool release];之间的对象


4. NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
当执行[pool autorelease]的时候,系统会进行一次内存释放,把autorelease的对象释放掉,如果没有NSAutoreleasePool , 那这些内存不会释放
注意,对象并不是自动被加入到当前pool中,而是需要对对象发送autorelease消息,这样,对象就被加到当前pool的管理里了。当当前pool接受到drain消息时,它就简单的对它所管理的所有对象发送release消息。
例如
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString* nsstring;
char* cstring = "Hello CString";
nsstring = [NSString stringWithUTF8String:cstring];
[pool release];


5. alloc的对象必须显示释放
例如:
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString* string = [[NSString alloc] init];
[string stringByAppendingString:@"Hello World!"];
[pool release];
[nsstring release];


6. 如果使用Automatic Reference Counting(ARC).不能直接使用autorelease pools,而是使用@autoreleasepool{ },
@autoreleasepool{ }比直接使用NSAutoreleasePool效率高。不使用ARC的时候也可以使用


7. [pool drain] 和 [pool release] 的区别:

release,在引用计数环境下,由于NSAutoReleasePool是一个不可以被retain的类型,所以release会直接dealloc pool对象。当pool被dealloc的时候,pool向所有在pool中的对象发出一个release的消息,如果一个对象在这个pool中autorelease了多次,pool对这个对象的每一次autorelease都会release。在GC环境下release是一个no-op操作(代表没有操作,是一个占据进行很少的空间但是指出没有操作的计算机指令)。

drain,在引用计数环境下,它的行为和release是一样的。在GC的环境下,这个方法调用objc_collect_if_needed出发GC。

因此,重点是:在GC环境下,release是一个no-op,所以除非你不希望在GC环境下出发GC,你都应该使用drain而不是使用release来释放pool。(in a garbage-collected environment, triggers garbage collection if the memory allocated since the last collection is greater than the current threshold)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

autorelease(IOS开发)的原理详解 的相关文章

  • 有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?

    Apple 算是最重视应用开发体验的公司了 从Xib到StoryBoard 从Auto Layout到Size Class 每一次的更新 都会给iOS应用的开发带来不小的便利 但是 对于绝对多数iOS攻城狮来说 我们依然还是很害怕写UITa
  • ios导航栏透明

    功能需求 根新浪微博个人主页类似 下拉拉伸放大图片下拉刷新 前面文章已解决 向上滑动的时候 导航栏的透明度逐渐增加 最后变成不透明的 当然说起来感觉其实没什么 不就是滑动改变透明度吗 但是做起来完全不是你想象的那样 首先解决透明度的问题 让
  • iOS开发环境xcode搭建

    1 到 https developer apple com download 或者在APP store下载 2 下载完成后会在launchpad显示 点击安装
  • 2022最新苹果开发者账号注册、付款流程图解【图文并茂】

    更新日期 2022 07 22 每年续费就有一个坑 文章末尾已注明 1 申请一个邮箱 用于注册苹果开发者账号 我的邮箱 密码 2 注册开发者账号 1 注册官网 官网地址 Apple Developer Program Apple Devel
  • fireFox post请求插件,火狐浏览器插件

    在开发过程中 为了测试数据 提交表单等 经常会用到post请求 在这里向大家介绍一款比较好用的浏览器插件 它可以很好的模拟post get put等常用的请求 大大便利了我们的开发 它就是fire fox中的RESTClient 安装方法如
  • Reachability(判断网络是否连接)

    类似于一个网络状况的探针 NSNotificationCenter defaultCenter addObserver self selector selector reachabilityChanged name kReachabilit
  • iOS Cookies.binarycookies(俗称63数据)存取

    iOS 系统会自动将Safari或APP中网络请求的cookie保存为文件 APP的cookie保存路径为APP的沙盒路径 var mobile Containers Data Application x x x Library Cooki
  • ad Hoc打包测试

    一 iOS证书 首先介绍一下iOS证书 iOS证书分两种 1 开发证书 用来给你 开发人员 做真机测试 2 发布证书 又分为两种 发布到app store 和发布测试的ad hoc证书 本文就详细讲解 ad hoc证书的创建 二 什么时候用
  • iOS左对齐自动换行collection样式

    前言 想必大家工作中或多或少会遇到下图样式的UI需求吧 像这种cell长度不固定 以此向右对齐排列的样式UI可以说是很常见的 实现方式 一般的实现可能主要是分一下两种 1 一种是用button依次排列实现 动态计算text宽度 记录之前一个
  • iOS App上架流程

    前言 作为一名IOS开发者 把开发出来的App上传到App Store是必须的 下面就来详细介绍下具体流程 1 打开苹果开发者中心 https developer apple com 打开后点击 Member Center 如果你的电脑没有
  • Swift open public等修饰符详解

    swift 中关于open public internal fileprivate private 修饰的说明 open 用open修饰的类可以在本某块 sdk 或者其他引入本模块的 sdk module 继承 如果是修饰属性的话可以被此模
  • iOS17适配指南-新版

    文章目录 一 iOS17适配点 二 具体代码 一 iOS17适配点 UIView与UIViewController 可以设置数据为空时的占位视图 增加SymbolAnimations 通过addSymbolEffect 与removeSym
  • Xcode5.1离线下载安装及使用iOS5模拟器进行开发调试的方法

    Xcode5 1默认不支持iOS5版本的模拟器开发调试 在OS X Mavericks 10 9 x 下默认只能支持iOS6 1及以上版本的模拟器 在OS X Mountain Lion 10 8 x 下默认只能支持iOS6 0及以上版本的
  • iOS下XMPP开发之XMPP开发环境配置(二)mac上搭建openfire服务器

    一 下载并安装openfire 1 到http www igniterealtime org downloads index jsp下载最新openfire for mac版 比如 Openfire 3 8 1 下载后的文件 openfir
  • Appstore审核被拒-[4. DESIGN: PREAMBLE]

    Appstore审核被拒原文如下 原因是设置里有一个版本信息可以响应点击事件进入一个版本详情页 苹果要求版本更新必须使用iOS版本更新内置更新机制 4 DESIGN PREAMBLE Design Preamble The version
  • 配置描述文件mobileconfig的生成及注意事项

    1 mobileconfig描述配置文件的下载 我们要控制ios上的移动设备 那么我们就需要下载mobileconfig描述配置文件 一般我们可以一个设备对应一个设备ID 即我们后面会看到的请求参数 deviceId 例如 PUT Path
  • iOS App打包上架详细流程

    一 前言 作为一名iOS开发者 把辛辛苦苦开发出来的App上传到App Store是件必要的事 但是很多人还是不知道该怎么上传到App Store上 下面就来详细讲解一下具体流程步骤 二 准备 一个已付费的开发者账号 可分为 账号类型分为个
  • 探究Xcode New Build System对于构建速度的提升

    在Xcode9发布的时候 Apple在Build System上提供了新版本的构建系统 New Build System 具体可见WWDC2017 不过令人失望的是 该新特性的讲解很简短 短到只在一页PPT上露脸 在这短短的时间里 苹果讲述
  • Objective-C 自动释放池不释放对象

    我对 Objective C 很陌生 正在阅读内存管理 我试图用 NSAutoreleasePool 玩一下 但不知何故它不会释放我的对象 我有一个带有 setter 和 getter 的类 它基本上设置一个 NSString name 释
  • Objective-C - 弱属性 - getter autoreleases(自动引用计数)

    我有疑问weakARC 中的属性 自动引用计数 我的理解 如有错误请指正 weak属性的行为类似于assign属性 但当该属性指向的实例被销毁时 ivar 会指向 nil 问题 我只是觉得吸气剂weak属性保留和自动释放 它不是应该像 ge

随机推荐

  • Java代码审计前置知识——SpringBoot基础

    目录 前言 一 SpringBoot简介 1 1 回顾什么是Spring 1 2 Spring是如何简化Java开发的 1 3 什么是SpringBoot 二 微服务 2 1 什么是微服务 2 2 单体应用架构
  • 服务超时、重试次数、熔断如何设置

    文章目录 一 超时时间 为什么要设置超时时间 超时时间怎么设置 二 重试次数怎么设置 三 熔断 工作流程 一 超时时间 为什么要设置超时时间 针对服务调用都要设置一个超时时间 以避免依赖的服务迟迟没有返回调用结果 把服务消费者拖死 超时时间
  • VS设置编码格式

  • RUBY易忘语法速查

    collect 迭代器 a 1 2 3 4 5 b a collect x 10 x putsb
  • 可以一口气读完的算法书

    算法 Algorithms 咳咳 很多人一听到这个词 估计脑袋就要炸了 一定又是复杂极了的东西 看来此书必定翻不过第一节 就要睡着了 没错 很多算法书虽然写得很精妙 但凭我这种智商一口气最多只能看5到10 页 就会乖乖滚回去睡觉了 不少读者
  • 写出更优雅的react组件(避免重复渲染)

    写出更优雅的react组件 一 存在问题 二 解决办法 类组件的解决方法 1 shouldComponentUpdate React 类组件的一个生命周期 2 PureComponent Immutable js 进阶版 1 为什么有了Pu
  • MES系统生产过程管理解决方案,主要包含哪些功能模块?

    MES生产过程管理 是从生产任务 生产工单下发 生产领料 生产报工 生产进度分析 计件工资管理等环节进行管控 并为管理人员提供生产看板 直观掌握生产情况 生产计划 工单管理 在下发生产任务 生产工单时 就已经把材料的总耗用量 每个工单 每个
  • vue中使用Ueditor编辑器

    vue中使用Ueditor编辑器 一 下载包 从Ueditor的官网下载1 4 3 3jsp版本的Ueditor编辑器 官网地址为 https github com fex team ueditor 下载解压后会得到如果下文件目录 将上述U
  • 【满分】【华为OD机试真题2023 JAVA&JS】查找树中元素

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 查找树中元素 知识点树BFS搜索广搜 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 已知树形结构的所有节点信息 现要求根据输入坐标 x y 找到该节点保存的内容
  • 全国紧跟数字中国步伐,用数字技术守护生命,共同见证国家治理现代化转型

    为了每个人都迈向美好的生活 为了国家治理的现代化 我国正紧锣密鼓地在数字经济 数字社会 和数字政府三大维度推进千行百业的信息化进程 这一行动也旨在落实我国 数字中国2025 的宏伟规划 数字中国 的核心包括数字化 网络化和标准化 它不仅仅体
  • 计算机内存调用优化,内存数据库的使用方法与优化方案分析

    数据存储都是保存在硬盘中的 而内存只是一个数据暂时存储和调用的缓冲地带 今天我们就一起来了解一下 关于内存缓存数据存储都有哪些问题需要了解 Redis是一种内存数据库 将数据保存在内存中 读写效率要比传统的将数据保存在磁盘上的数据库要快很多
  • 分治算法——求逆序对数

    分治求逆序对数 问题描述 在Internet上的搜索引擎经常需要对信息进行比较 比如可以通过某个人对一些事物的排名来估计他对各种不同信息的兴趣 从而实现个性化服务 对于不同的排名结果可以用逆序来评价他们之间的差异 考虑1 2 n的排列i1
  • 【目标检测】42、目标检测回顾

    文章目录 Abstract 1 Introduction 2 Problem Setting 3 Detection Components 3 1 Detection Settings 3 2 Detection Paradigms 3 2
  • JS 中 replace 和 replaceAll 的区别?

    方法解释 两种方法都返回一个新字符串 原始字符串保持不变 并且改方法可以传两个参数 参数一 pattern pattern 可以是一个 字符串 或一个 正则表达式 参数二 replacement replacement 可以是一个字符串或一
  • c语言const字符串,C语言之正确使用const

    一 const用途 const是一个C语言的关键字 它限定一个变量不允许被改变 1 const与基本类型 const char m 限定m不可变 2 const与指针 1 const在 前面 const char p p是const p可变
  • 浅析eTS的起源和演进

    引言 Mozilla创造了JS Microsoft创建了TS Huawei进一步推出了eTS 从最初的基础的逻辑交互能力 到具备类型系统的高效工程开发能力 再到融合声明式UI 多维状态管理等丰富的应用开发能力 共同组成了相关的演进脉络 原文
  • zookeeper常用命令详解

    目录 1 zkCli sh客户端 2 多节点类型创建 3 查询节点 4 set数据 5 删除节点 6 权限设置 7 其他命令 注意我这里用的是官方最稳定的版本3 7 1 版本之间有个别命令是有差距的 1 zkCli sh客户端 zkCli
  • 区块链技术在金融行业的应用

    作为比特币背后的分布式账本技术 区块链 它的热潮似乎已经无可阻挡 在区块链的创新和应用探索中 金融是最主要的领域 现阶段主要的区块链应用探索和实践 也都是围绕金融领域展开的 在金融领域中 区块链技术在数字货币 支付清算 智能合约 金融交易
  • tmux的使用方法和个性化配置

    tmux的使用方法和个性化配置 tmux是一个优秀的终端复用软件 即使非正常掉线 也能保证当前的任务运行 这一点对于 远程SSH访问特别有用 网络不好的情况下仍然能保证工作现场不丢失 此外 tmux完全使用键盘 控制窗口 实现窗口的切换功能
  • autorelease(IOS开发)的原理详解

    转载出处 http tieba baidu com p 3427605546 转载出处 http blog csdn net c395565746c article details 7613814 当您向一个对象发送一个autoreleas