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-自动释放池应用场景相关推荐

  1. 自动释放池 ARC机制

    IOS学习第24天 @class 1.两个类A和B,如果互相#import对方头文件,会造成死循环2.解决方式: 在其中的一方,不要用#import <xxx.h>来引入对方的头文件,用@ ...

  2. ios中的自动释放池

    自动释放池中是否有虑重功能 1 @autoreleasepool { 2 UIView *view = [UIView alloc] init] autorelease]; 3 [view autor ...

  3. iOS 多线程 自动释放池常见面试题代码

    同步:代码依次执行,一个人执行多个任务,也是依次执行.一个人在同一时间只执行一个任务 异步:可以同时执行多个任务 进程:指在系统中运行的应用程序,每个进程都是独立的,都有独立的且安全的运行空间 线程: ...

  4. 内存管理-定时器循环、内存布局、tagged pointer、weak指针、copy、自动释放池

    先上代码,我们平时用的定时器,cadisplaylink.nstimer,CADisplayLink.NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用 ...

  5. 自动释放池autoreleasepool

    自动释放池是NSAutoreleasePool的实例,其中包含了收到autorelease消息的对象.当一个自动释放池自身被销毁(dealloc)时,它会给池中每一个对象发送一个release消息(如 ...

  6. 【深入Cocos2d-x】探索Cocos2d-x中的内存管理-引用计数和自动释放池

    2019独角兽企业重金招聘Python工程师标准>>> #深入Cocos2d-x-探索Cocos2d-x中的内存管理-引用计数和自动释放池 ###引用计数(Reference Cou ...

  7. 第六讲:Obj-C 内存管理4 - 自动释放池

    转:http://tigercat1977.blog.163.com/blog/static/2141561122012111294616203/ 第六讲:Obj-C 内存管理4 - 自动释放池 主要 ...

  8. iOS之深入解析自动释放池autoreleasepool的底层原理

    一.自动释放池 autoreleasepool 原理 自动释放池是 OC 中的一种内存自动回收机制,它可以将加入 autoreleasePool 中的变量 release 的时机延迟. 简单来说,就是 ...

  9. (转)Objective-C Autorelease Pools(自动释放池)详解

    本篇将给您介绍"Autorelease Pools"(自动释放池)在应用中的使用技巧. 1,Autorelease Pools概要 一个"Autorelease Pool ...

最新文章

  1. python:get和set
  2. 报名 | 2019年社会计算机国际会议
  3. python简单界面实现-python实现的简单窗口倒计时界面实例
  4. tomcat主目录(ROOT.xml)和虚拟目录
  5. [搬运] iOS 7 侧滑返回手势使用和错误集
  6. RabbitMQ 交换器、持久化
  7. Java多线程之Callable、Future和FutureTask
  8. windows查看器无法打开图片_关于windows微软商城无法打开 错误代码0x80004003问题...
  9. python制作简单网页_python 跑服务器,访问自己制作的简单页面
  10. python里的文件I/O
  11. 测试一下Windows Live Writer能否正常使用。
  12. AJAX实现瀑布流布局
  13. c语言:猴子吃桃问题
  14. SQLServer2005中的CTE递归查询得到一棵树
  15. 对Movielens数据集进行评分预测
  16. 用超级鹰来识别B站图片验证
  17. 烽火服务器安装系统,烽火服务器进入bios配置
  18. (STM32CubeMX)超声波模块测距传感器学习笔记
  19. 使用Labwindows开发DAQmx
  20. 计算机常用的辅存储器是,计算机常用的辅存储器有

热门文章

  1. 【吴恩达机器学习】学习笔记——1.3机器学习的定义
  2. Nagios(装包、文件类型)
  3. 十二、实战底部(二)
  4. ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法
  5. Toggle Buttons(二)
  6. cocos2D创建一组单选按钮菜单
  7. 动态添加TemplateField列
  8. Python数据分析Numpy库方法简介(一)
  9. JavaScript设计模式第一弹-创建型设计模式
  10. linux系统进入救援模式