zoukankan      html  css  js  c++  java
  • 0c-36-自动释放池应用场景

    1、autorelease的应用场景
    
    经常用来在类方法中快速创建1个对象。
    // 声明实现一个类方法
    + (Student *)student
    {
      // 在里面直接进行autorelease
      return [[[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; }
  • 相关阅读:
    Android Dalvik 虚拟机
    我在北京找工作(二):java实现算法<1> 冒泡排序+直接选择排序
    如何用java比较两个时间或日期的大小
    [安卓破解]听网页浏览器,无需注册即可语音朗读
    (step8.2.4)hdu 1846(Brave Game——巴什博奕)
    Oracle Database 12c Release 1 Installation On Oracle Linux 6.4 x86_64
    HDU2084:数塔(DP)
    MySQL MVCC(多版本并发控制)
    POJ
    网易前端微专业,JavaScript程序设计基础篇:数组
  • 原文地址:https://www.cnblogs.com/yaowen/p/5315676.html
Copyright © 2011-2022 走看看