【iOS开发-34】自己主动释放池@autoreleasepool的使用注意事项以及ARC机制——面试必考内容
自己主动释放池@autorelease面试频率可能会吧release还要高。
(1)在自己主动释放池@autoreleasepool{}中alloc一个对象后(如p1)。仍然须要用[p1 autorelease];不过这个语句和[p1 release];不同。后者表示把p1的retainCount-1,而前者只表示把p1放到自己主动释放池中返回一个self,自己主动释放池结束销毁时,统一对里面的对象引用计数retainCount-1。
(2)@autoreleasepool{}能够任意创建。也能够嵌套使用。
(3)无论这个对象是在自己主动释放池内还是外创建的,仅仅要在自己主动释放池内写一个[p1 autorelease];p1就会被放到自己主动释放池中。
注意autorelease是一个方法。且仅仅有在自己主动释放池中使用才有效。
(4)假设把一个对象反复加到自己主动释放池如[p1 autorelease];[p1 autorelease];。那么会出错。原因是:载入几次。届时自己主动释放池就会用[p1 release];释放几次,可是因为这两个载入的对象事实上是一个对象相同地址,所以第一次自己主动释放正确,第二次自己主动释放时发现已经被释放了。所以p1就变成了野指针。
(5)下面是自己主动释放池嵌套的使用规则和注意点。
#import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) { Person *p1=[[Person alloc]init];
@autoreleasepool {
@autoreleasepool {
[p1 autorelease];
}//在运行到此处时,p1被自己主动释放
} //下面代码有错误
@autoreleasepool {
[p1 autorelease];//此时p1被增加进来
@autoreleasepool {
[p1 autorelease];//被反复载入进来。但仍然同一个
}//此处,p1被自己主动释放了。所以第一次加进来的那个也被释放了。由于是同一个对象
}//所以此处在调用[p1 release];时就出现报错:野指针 return 0;
}
(6)@autoreleasepool的应用:假设须要在方法中创建对象。并把这个对象作为返回值,那么能够在这种方法中使用[*** autorelease];把它增加到自己主动释放池中。否则。直接用[*** release];来匹配alloc的话,在该方法中就已经把这个对象alloc和release了一遍相当于释放了。那么所谓的返回对象返回的时一个野指针(没有指向不论什么对象)。当然。调用这种方法的代码页须要写在自己主动释放池作用域内才生效。
(7)接上面。返回对象的那个方法中,创建对象不建议直接用类名,而是用self。否则假设存在子类调用会崩溃。
如Car *car1=[[self alloc]init];
(8)事实上诸如NSString *str1=[NSString stringWithFormat:@"%@",@"hello"];也是调用了一个方法,而且返回了一个字符串对象。
比照(6)和(7)我们得知这个stringWithFormat应该也是顺便返回了一个autorelease。
(9)在ARC机制中。我们用@property声明的成员变量,建议用strong取代之前手动管理内存时的retain。尽管后者仍然能够使用。由于我们在ARC中内存管理就是看是否有强指针指向对象,如有就不回收。如没有就回收。
所以强指针是strong,相反是weak。而基本数据类型我们还是习惯用assign。
(10)尽管Xcode提供了非ARC转换成ARC的,非常少有把整个非ARC转换成ARC的。假设我们导入第三方库时。须要非ARC和ARC共存。即我们系统默认是ARC。我们须要让系统不要去管这个非ARC的第三方库,例如以下设置:双击响应的.m文件。输入-fno-objc-arc回车就可以。
(11)顺便。当出现两个类循环引用的话(也就是A要包括B。B要包括A。即A对象要作为B的变量,B对象要作为A的变量),仅仅须要把一方的strong改成weak。而且在响应的.h文件里把#import ".h"改成Class ***。
假设由于改成Class ***而无法使用那个类的方法的话,仅仅须要在它的.m文件里#import“.h”文件就可以,这个由于不是在.h文件里导入所以不冲突。
【iOS开发-34】自己主动释放池@autoreleasepool的使用注意事项以及ARC机制——面试必考内容的更多相关文章
- 【iOS开发-33】学习手动内存管理临时抛弃ARC以及retain/assign知识——iOSproject师面试必考内容
我们为什么须要内存管理?当使用内存达到40M和45M时候会发出警告,假设不处理,占用内存达到120M时直接强制关闭程序. 所以出现闪退除了是程序出现逻辑错误,还有可能是内存使用过大. (1)创建一个对 ...
- cocos2D-x 3.5 引擎解析之--引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)
#include <CCRef.h> Ref is used for reference count manangement. If a classinherits from Ref. C ...
- Foundation框架经常使用数据类型和NSAutoreleasePool自己主动释放池解析
第一.NSAutoreleasePool自己主动释放池解析 1.自己主动释放池的物理实现 自己主动释放池用栈来实现.当你创建一个新的自己主动释放池是,会压栈到栈顶.接受autorelease消息的对象 ...
- 刀哥多线程自动释放池autoreleasepool
自动释放池 作用 自动释放对象的 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中 自动释放池被销毁或者耗尽时,会向池中所有对象发送 release 消息, ...
- OC自动释放池autoreleasepool介绍
自动释放池的机制是:它使得应用在创建新对象时,系统能够有效地管理应用所使用的内存. @autoreleasepool { statements } 在创建新对象时,并且系统未启动ARC特性,那么在使用 ...
- 自动释放池autoreleasepool
自动释放池是NSAutoreleasePool的实例,其中包含了收到autorelease消息的对象.当一个自动释放池自身被销毁(dealloc)时,它会给池中每一个对象发送一个release消息(如 ...
- iOS开发- UILabel 自己主动换行 及 高度自适应
主要是今天看到论坛有人问这个问题.帮忙解决之后, 顺便Mark下. 非常easy, 代码写的非常清楚. 直接上代码. UILabel *label = [[UILabel alloc] initWit ...
- cocos2d-x-3.3rc2-003 cocos中的引用计数和自己主动释放池
点击打开链接
- 自动释放池的前世今生 ---- 深入解析 autoreleasepool
http://draveness.me/autoreleasepool.html 关注仓库,及时获得更新:iOS-Source-Code-Analyze Follow: Draveness · Git ...
随机推荐
- [AHOI2013]作业 莫队 树状数组
#include<cmath> #include<cstdio> #include<algorithm> #include<string> #inclu ...
- js常见语法错误
“Missing semicolon.” : “缺少分号.”, “Use the function form of \”use strict\”.” : “使用标准化定义function.”, “Un ...
- 模块 -logging
模块 -logging 一:在控制台显示:默认 import logging logging.debug("debug") logging.info("debug&quo ...
- [LOJ2607]【NOIP2012】疫情控制
题意: 题目描述 H 国有n个城市,这n个城市用n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边 ...
- POJ-3436 ACM Computer Factory 最大流 为何拆点
题目链接:https://cn.vjudge.net/problem/POJ-3436 题意 懒得翻,找了个题意. 流水线上有N台机器装电脑,电脑有P个部件,每台机器有三个参数,产量,输入规格,输出规 ...
- HDU-1024 Max Sum Plus Plus 动态规划 滚动数组和转移优化
题目链接:https://cn.vjudge.net/problem/HDU-1024 题意 给n, m和一个序列,找m个不重叠子串,使这几个子串内元素和的和最大. n<=1e6 例:1 3 1 ...
- UVA-1602 Lattice Animals 搜索问题(打表+set)
题目链接 https://vjudge.net/problem/UVA-1602 紫书的一道例题,跟之前的很多题目有很多不同. 本题不像是一般的dfs或bfs这样的搜索套路,而是另一种枚举思路. 题意 ...
- HDU-2204- Eddy’s爱好 (容斥原理)
题意 给出一个数n,问1-n中有多少个数可以表示为m^k,m,k均为正整数且k>1 (1<=n<=1^18) 题解 (一开始^以为是异或懵逼了好久....) 额,显然1这个数比较讨厌 ...
- [NOI2014]动物园(KMP)
题意 题解 因为,一直用j=nxt[j]来遍历,可以遍历前i个字符所有相等的前后缀长度,所以有一个暴力的想法,就是对于每一个长度,开始遍历,记录长度小于i/2的相等的前后缀数量,最后累加即可. 但显然 ...
- sqlmap 实战漏洞平台dvwa进行密码破解
2016-05-24 (1)实验的具体的环境极其思路 首先我们要检测我们的漏洞平台是否有sql注入 ,进行简单的测试发现在用户userid 上存在注入的漏洞 使用抓包工具对其cookie 进行获取如下 ...