0c-36-自动释放池应用场景
1、autorelease的应用场景经常用来在类方法中快速创建1个对象。 // 声明实现一个类方法 + (Student *)student {// 在里面直接进行autoreleasereturn [[[Student alloc] init] autorelease]; } 应用: // 在自动释放池中使用类方法创建对象 @autoreleasepool{ // 此时创建出来的对象不用关注释放问题。 Student *s = [Student student]; } 错误写法:int main(){ // 在自动释放池中使用类方法创建对象 @autoreleasepool{} // 写在自动释放池外部将无法释放对象。 Student *s = [Student student]; reutrn 0; } 2、完善快速创建对象的方法问题1:如果定1个GoodStudent,继承自Student,此时,还能使用类方法快速创建对象吗?解决方案:在类方法中使用id + (id)student { return [[[Student alloc] init] autorelease]; } 此时,返回的对象仍旧是Student.所以,应该用self,替代Student.问题2:用其他对象类型,接受自定义对象类型。 如:NSString *s = [Student student];NSLog(@"%lu",s.length); 这段代码,编译时,不会报任何警告,但是运行时会直接崩溃。 改进办法://instancetype:可以动态判断返回的类型和接受的类型是否一致 + (instancetype)student{return [[self alloc] init]; } 此时,编译器会警告NSString *s = [Student student];NSLog(@"%lu",s.length);
【理解】应用:创建1个学生类初始化年龄思考&实现1:创建一个学生类Student,通过重写构造方法实现创建学生对象的时候,默认的年龄值指定的年龄。 // 声明文件 #import <Foundation/Foundation.h> @interface Student : NSObject // 年龄属性 @property(nonatomic,assign) int age;// 自定义构造方法 -(instancetype)initWithAge:(int)age;// 自定义类方法 +(instancetype)studentWithAge:(int)age; @end// 实现文件 #import "Student.h" @implementation Student- (void)dealloc { NSLog(@"Student 被释放"); [super dealloc]; }//自定义构造方法 -(instancetype)initWithAge:(int)age { if (self = [super init]) { _age = age; } return self; }//自定义初始化方法 +(instancetype)studentWithAge:(int)age { return [[[self alloc] initWithAge:age] autorelease]; } @end// 主函数 #import <Foundation/Foundation.h> #import "Student.h"int main(int argc, const char * argv[]) { @autoreleasepool {// 通过构造方法,初始化学生对象 Student *stu = [[[Student alloc] initWithAge:10] autorelease];// 通过类方法,初始化学生对象 Student *stu1 = [Student studentWithAge:100];// 输出结果 NSLog(@"age = %d",stu1.age); } return 0; }
本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5315676.html,如需转载请自行联系原作者
0c-36-自动释放池应用场景相关推荐
- 自动释放池 ARC机制
IOS学习第24天 @class 1.两个类A和B,如果互相#import对方头文件,会造成死循环2.解决方式: 在其中的一方,不要用#import <xxx.h>来引入对方的头文件,用@ ...
- ios中的自动释放池
自动释放池中是否有虑重功能 1 @autoreleasepool { 2 UIView *view = [UIView alloc] init] autorelease]; 3 [view autor ...
- iOS 多线程 自动释放池常见面试题代码
同步:代码依次执行,一个人执行多个任务,也是依次执行.一个人在同一时间只执行一个任务 异步:可以同时执行多个任务 进程:指在系统中运行的应用程序,每个进程都是独立的,都有独立的且安全的运行空间 线程: ...
- 内存管理-定时器循环、内存布局、tagged pointer、weak指针、copy、自动释放池
先上代码,我们平时用的定时器,cadisplaylink.nstimer,CADisplayLink.NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用 ...
- 自动释放池autoreleasepool
自动释放池是NSAutoreleasePool的实例,其中包含了收到autorelease消息的对象.当一个自动释放池自身被销毁(dealloc)时,它会给池中每一个对象发送一个release消息(如 ...
- 【深入Cocos2d-x】探索Cocos2d-x中的内存管理-引用计数和自动释放池
2019独角兽企业重金招聘Python工程师标准>>> #深入Cocos2d-x-探索Cocos2d-x中的内存管理-引用计数和自动释放池 ###引用计数(Reference Cou ...
- 第六讲:Obj-C 内存管理4 - 自动释放池
转:http://tigercat1977.blog.163.com/blog/static/2141561122012111294616203/ 第六讲:Obj-C 内存管理4 - 自动释放池 主要 ...
- iOS之深入解析自动释放池autoreleasepool的底层原理
一.自动释放池 autoreleasepool 原理 自动释放池是 OC 中的一种内存自动回收机制,它可以将加入 autoreleasePool 中的变量 release 的时机延迟. 简单来说,就是 ...
- (转)Objective-C Autorelease Pools(自动释放池)详解
本篇将给您介绍"Autorelease Pools"(自动释放池)在应用中的使用技巧. 1,Autorelease Pools概要 一个"Autorelease Pool ...
最新文章
- python:get和set
- 报名 | 2019年社会计算机国际会议
- python简单界面实现-python实现的简单窗口倒计时界面实例
- tomcat主目录(ROOT.xml)和虚拟目录
- [搬运] iOS 7 侧滑返回手势使用和错误集
- RabbitMQ 交换器、持久化
- Java多线程之Callable、Future和FutureTask
- windows查看器无法打开图片_关于windows微软商城无法打开 错误代码0x80004003问题...
- python制作简单网页_python 跑服务器,访问自己制作的简单页面
- python里的文件I/O
- 测试一下Windows Live Writer能否正常使用。
- AJAX实现瀑布流布局
- c语言:猴子吃桃问题
- SQLServer2005中的CTE递归查询得到一棵树
- 对Movielens数据集进行评分预测
- 用超级鹰来识别B站图片验证
- 烽火服务器安装系统,烽火服务器进入bios配置
- (STM32CubeMX)超声波模块测距传感器学习笔记
- 使用Labwindows开发DAQmx
- 计算机常用的辅存储器是,计算机常用的辅存储器有