【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 ...
随机推荐
- 这两道题目很相似 最优还钱方式 & 除法推导
http://www.cnblogs.com/grandyang/p/6108158.html http://www.cnblogs.com/grandyang/p/5880133.html 都是根据 ...
- 【linux驱动分析】misc设备驱动
misc设备驱动.又称混杂设备驱动. misc设备驱动共享一个设备驱动号MISC_MAJOR.它在include\linux\major.h中定义: #define MISC_MAJO ...
- Unity游戏开发--30s制作精美地图
"君子生非异也.善假于物也"--<劝学>荀子 引用这句话的目的,是我觉得有时候.利用工具来提高游戏开发效率是很必要的. 利用工具,解放程序员双手. 今天想给大家介绍下. ...
- 用html语言写一个功课表
今天在网上看了一个关于html的教程,主要是讲表格,看完之后认为有必要上机试试.于是就写了以下的一段代码. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb ...
- 用DOM动态控制表格
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- bzoj1070: [SCOI2007]修车(费用流)
1070: [SCOI2007]修车 题目:传送门 题解: 一道挺简单的费用流吧...胡乱建模走起 贴个代码... #include<cstdio> #include<cstring ...
- hdoj--1312--Red and Black(dfs)
Red and Black Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- rest_framework-版本-总结完结篇
总urls.py from django.conf.urls import url, include urlpatterns = [ url(r'^api/', include('api.urls') ...
- rest_framework 分页三种
.分页 a. 分页 看第n页 每页显示n条数据: b. 分页 在某个位置 向后查看多少条数据 c. 加密分页 上一页和下一页 本质:查看 记住页码id的最大值和最小值 通过其来准确扫描 过去的话 会从 ...
- [poj 2480] Longge's problem 解题报告 (欧拉函数)
题目链接:http://poj.org/problem?id=2480 题目大意: 题解: 我一直很欣赏数学题完美的复杂度 #include<cstring> #include<al ...