美文网首页
07-11、自定义类工厂方法+ (instancetype)类名

07-11、自定义类工厂方法+ (instancetype)类名

作者: 山中石头 | 来源:发表于2017-09-22 11:04 被阅读0次
    什么是类工厂方法:

    用于快速创建对象的类方法, 我们称之为类工厂方法
    类工厂方法中主要用于 给对象分配存储空间和初始化这块存储空间

    规范:
    1.一定是类方法 +
    2.方法名称以类的名称开头, 首字母小写
    3.一定有返回值, 返回值是id/instancetype

    苹果的一个规范(重要)

    自定义类工厂方法是苹果的一个规范, 一般情况下, 我们会给一个类提供自定义构造方法和自定义类工厂方法用于创建一个对象
    // [[NSString alloc] init]; //构造方法创建字符串对象
    // [NSString string]; //相对应的类工厂方法创建字符串对象
    // [[NSString alloc] initWithString:<#(NSString *)#>];//构造方法创建字符串对象
    // [NSString stringWithString:<#(NSString *)#>];//相对应的类工厂方法创建字符串对象
    // [[NSArray alloc] init];//构造方法创建数组对象
    // [NSArray array];//相对应的类工厂方法创建数组对象
    // [NSArray alloc] initWithObjects:<#(id), ...#>, nil//构造方法创建数组对象
    // [NSArray arrayWithObjects:<#(id), ...#>, nil]//相对应的类工厂方法创建数组对象

    类工厂方法在继承中的注意点(重要):

    // 注意: 以后但凡自定义类工厂方法, 在类工厂方法中创建对象一定不要使用类名来创建
    // 一定要使用self来创建
    // self在类方法中就代表类对象, 到底代表哪一个类对象呢?
    // 谁调用当前方法, self就代表谁

    Person.m
    #import "Person.h"
    
    @implementation Person
    
    
    + (instancetype)person
    {
    //    return [[Person alloc] init];
    // 注意: 以后但凡自定义类工厂方法, 在类工厂方法中创建对象一定不要使用类名来创建
    // 一定要使用self来创建
    // self在类方法中就代表类对象, 到底代表哪一个类对象呢?
    // 谁调用当前方法, self就代表谁
    return [[self alloc] init];
    }
    
    + (instancetype)personWithAge:(int)age
    {
    //    Person *p = [[Person alloc] init];
    Person *p = [[self alloc] init];
    p.age = age;
    return p;
    }
    
    @end
    
    main.m
      #import <Foundation/Foundation.h>
    #import "Student.h"
    
    int main(int argc, const char * argv[]) {
    
    /*
    Student *stu = [Student person]; // [[Person alloc] init];
    (如果Person的类工厂方法没有用self后面给no赋值就会报错,因为no是Student的特有属性。)
    Person *p = [Person person];
    //    stu.age = 55;
    //    NSLog(@"age = %i", stu.age);
    stu.no = 888;
    NSLog(@"no = %i", stu.no);
     */
    (如果Person的类工厂方法没有用self后面给no赋值就会报错,因为no是Student的特有属性。)
    Student *stu = [Student personWithAge:30];
    Person *p = [Person personWithAge:30];
    stu.no = 888;
    
    return 0;
    }

    相关文章

      网友评论

          本文标题:07-11、自定义类工厂方法+ (instancetype)类名

          本文链接:https://www.haomeiwen.com/subject/zwgxextx.html