、autorelease的应用场景

经常用来在类方法中快速创建1个对象。
// 声明实现一个类方法
+ (Student *)student
{
// 在里面直接进行autorelease
return [[[Student alloc] init] autorelease];
}
应用:
// 在自动释放池中使用类方法创建对象
@autoreleasepool{
// 此时创建出来的对象不用关注释放问题。
Student *s = [Student student];
}
错误写法: int main(){
// 在自动释放池中使用类方法创建对象
@autoreleasepool{ }
// 写在自动释放池外部将无法释放对象。
Student *s = [Student student];
reutrn ;
}
、完善快速创建对象的方法 问题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:] autorelease]; // 通过类方法,初始化学生对象
Student *stu1 = [Student studentWithAge:]; // 输出结果
NSLog(@"age = %d",stu1.age);
}
return ; }

0c-36-自动释放池应用场景的更多相关文章

  1. Autorelease自动释放池的使用

    Autorelease自动释放池的使用 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain.release和autorelease. MRC内存管理原则:谁申请,谁释放 遇到al ...

  2. OC中对象元素的引用计数 自动释放池的相关概念

    OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc]  view plaincopy 1. //   2. / ...

  3. (五十八)NSObject实现多线程、自动释放池的补充

    模拟一个图片下载的场景,图片的下载需要2s,在这期间为了保证程序的流畅,应该把图片的下载放在子线程中进行. 使用NSObject的方法performSelectorInBackground方法即可实现 ...

  4. 63 (OC)* NSAutoreleasePool 自动释放池

    目录 0:ARC 1: 自动释放池 2:NSAutoreleasePool实现原理 3:autorelease 方法 4: Runloop和Autorelease的关系 5: Using Autore ...

  5. OC 内存泄露 自动释放池

    花絮:看到下面的代码就想起这么一个调侃: 一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法.提笔思索良久后在纸上写下:Hello world! /********************** ...

  6. autoreleasepool自动释放池

     示例: @autoreleasepool { ; i[largeNumber; i++) { (因识别问题,该行代码中尖括号改为方括号代替) Person *per = [[Person alloc ...

  7. OC之property和自动释放池

    property实例 property参数 自动释放池 一.property实例 1.前边的例子我们看到,我们在一个类中如果用到另外一个类的实例作为自己的成员变量时,通常需要在setter方法中,先r ...

  8. OC12_自动释放池

    // // Dog.h // OC12_自动释放池 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxuem ...

  9. OC11_自动释放池

    // // Dog.h // OC11_自动释放池 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxuem ...

随机推荐

  1. WCF_Config頁面常用配置

    右键点击App.config文件,选中Edit WCF Configuration进行编辑,我们添加2个baseAddress,一个是基于HTTP协议的:一个是基于TCP协议的.同时添加2个bindi ...

  2. configsections規範配置信息

    對於小型項目,配置信息可以通过appSettings进行配置,而如果配置信息太多,appSettings显得有些乱,而且在开发人员调用时,也不够友好,节点名称很容易写错,这时,我们有几种解决方案 1 ...

  3. 刚刚大学毕业,自己搭网站遇到的问题 一:tomcat中同时部署两个项目的问题

    最近直接把两个项目打成war包在tomcat下发布,出现了很多莫名奇妙的问题,就是不能发布成功,只能有一个项目能成功,在网上查了很多方法,以为是两个项目中jar包出现冲突,也按照网上的方法把两个项目中 ...

  4. kali 更新源

    个人收集的kali 更新源: 修改更新源: vim /etc/apt/sources.list 更新源列表包: #apt-get update 更新系统软件: #apt-get upgrade #官方 ...

  5. 使用Java程序调用MatLab

    Java代码实现的计算难免会显得不够高效.而利用MATLAB写好相应的计算函数,然后打包成jar包供Java调用,在某些情况下会更加方便.或者有些时候会涉及到使用Java调用MatLab展现一些二维三 ...

  6. [翻译]创建ASP.NET WebApi RESTful 服务(10)

    通过URI实现版本管理 另一种实现版本管理的方式就是通过URI来进行处理,类似于http://localhost:{your_port}/api/v1/students/.这种方式的好处是使用者可以清 ...

  7. Wisdombud.CommonTool及其应用

    @(编程) 1. 用法 student类 using System.ComponentModel; namespace WindowsFormsApplication1 { public class ...

  8. spring mvc为何多注入了个SimpleUrlHandlerMapping?

    最近在调试项目时,debug DispatcherServlet时,发现handlerMappings属性包含了RequestMappingHandlerMapping.SimpleUrlHandle ...

  9. USB开发库文件分析

    stm32f10x_it.c: 该文件中包含 USB 中断服务程序,由于 USB 中断有很多情况,这里的中断服务程序只是调用 usb_Istr.c 文件中的 USB_Istr 函数,由 USB_Ist ...

  10. Guid函数

    使用GUID函数可以得到一个不重复的序列号,但是考虑到会出现并发等一系列情况,所以建议使用时间+GUID的方法去生成一串序列号 ,一般语法如下: string str = System.Guid.Ne ...