• 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; }
  • 相关阅读:
    Vue动画
    Vue的生命周期
    《JavaScript高级程序设计第三版》——细碎知识痛点整理(第六章)
    《JavaScript高级程序设计第三版》——细碎知识痛点整理(第五章)
    stylus(css预编译器)
    《JavaScript高级程序设计第三版》——细碎知识痛点整理(第三章到第四章)
    nodejs安装配置
    mac安装sudo pip install MySQL-python报错EnvironmentError: mysql_config not found解决方法
    2016
    chrome浏览器自动刷新问题
  • 原文地址:https://www.cnblogs.com/yaowen/p/5315676.html
Copyright © 2020-2023  润新知