、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. WebGoat学习——SQL注入(SQL Injection)

    SQL注入(SQL Injection) 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.攻击者通过web请求提交带有影响正 ...

  2. Java WEB —— Java提升

    Java 5.0新特性: 枚举: enum Grade{ --> 相当于类 A("80~100"),B("70~80"),C("60~70&qu ...

  3. Transact-SQL

    Transact-SQL(又称T-SQL),是在Microsoft SQL Server和Sybase SQL Server上的ANSI SQL实现,与Oracle的PL/SQL性质相近(不只是实现A ...

  4. 从数列1,2,3.......n 中 随意取几个数,使其和等于 m

    //从数列1,2,3.......n 中 随意取几个数,使其和等于 m           public static void Print(int n, int m, List<int> ...

  5. 【125】固定IP的电脑配置无线路由

    标题所提到的情况即为有些电脑是用静态IP上网的,与普通的宽带连接稍微有些不同,例如我的电脑的静态IP设置是这样的: 只有按照上面的设置才可以正常上网,因此在配置无线路由器的时候也要用到上面的内容,废话 ...

  6. Controlling GameObjects Using Components

    [Accessing Components] The most common case is where a script needs access to other Components attac ...

  7. python 应用xml.dom.minidom读xml

    xml文件 <?xml version="1.0" encoding="utf-8"?> <city> <name>上海&l ...

  8. windows服务安装及卸载

    1)安装脚本Install.bat%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe JobSchedule.exeNet ...

  9. HDU1712简单的分组背包

    HDU1712http://acm.hdu.edu.cn/showproblem.php?pid=1712 简单的分组背包 #include <map> #include <set& ...

  10. thinkphp过滤html、script

    使用tp3.1版本 1.APP/common 自定义函数 function filter_default(&$value){ $value = htmlspecialchars($value) ...