美文网首页OC语言学习
关于OC动态数据类型 构造方法和类工厂等知识点的学习

关于OC动态数据类型 构造方法和类工厂等知识点的学习

作者: Gerhard_Z | 来源:发表于2017-01-17 14:03 被阅读0次

    iOS学习笔记整理

    @property

    @property 是一个编译器的指令
    它可以代替生成getter/setter方法的声明
    在Xcode 4.X版本后 @property既可以代替生成getter/setter方法的声明也可以生成getter/setter方法的实现
    还可以生成带_的成员变量
    如:@porporty int age会生成

    - (void)setAge:(int)age;
    - (int)age;
    int _age;
    

    @synthesize也是一个编译器指令
    它可以代替生成getter/getter方法的实现
    但其功能已经被@property所代替

    @property有两个修饰符
    一个是readwrite 读写功能(默认状态)
    一个是readonly 只读功能 例:@property(readonly)NSString *name
    @property还可以修改getter/setter的名字
    例如

    @property(getter = isMan) BOOL Sex;
    [p setSex:YES/NO];
    If(isMan){
                    xxx
    }
    //getter = isXxxx是程序员之间的一个约定 一定情况下获取BOOL值的话
    

    id数据类型

    id数据类型是一个动态数据类型
    id == NSObject *== 万能指针
    可以作为定义变量,作为函数的参数,作为函数的返回值
    可以访问子类的特有的方法 可以调用私有方法(Xcode8.x)似乎已经没有了这个功能了,如果用动态数据类型定义变量,如果访问了不属于动态数据类型的属性和方法时,编译器不会报错(运行时报错),而静态数据类型会报错
    应用场景:多态,可以减少代码量,避免之类忒有的方法需要强制类型转换 慎用
    为了避免运行时发生错误,一般情况下用id定义一个变量时,在进行调用前可以进行一次判断,判断时候当前变量是否能够调用该方法
    例:

    id obj = [[Student alloc] init];
    If([obj is kingOfClass:[Person class]])
    {
    
    }
    //判断是否在当前类或当前类的子类中是否可以调用该方法
    If([obj is memberOfClass:[Person class]])
    {
    
    }
    //判断是否在当前类中是否可以调用该方法
    

    构造方法

    在OC中init开头的方法叫构造方法
    重写init必须按照苹果规定的格式:
    1.初始化父类
    2.判断父类是否初始化,再初始化子类
    3.返回self
    例如:

    if(self = [super init])
    {
        
    }
    return self;
    

    instancetype

    也是一个万能指针
    和id的区别是在编译时可以知道真是类型
    instancetype只能作为返回值

    自定义构造方法

    应用场景:获取服务器数据
    init后面的首字母一定要大写
    规范:
    1.一定是个对象方法
    2.一定返回id或者instancetype
    3.方法名称一定以init开头
    注意:属性名称,方法名称不要以new开头
    例如:

    -(instancetype)initWithAge:(int)age
    {
        if(self = [super init])
        {
            _age = age;
        }
        return self;
    }
    //or
    -(instancetype)initWithAge:(int)age andWithHeight:(double)height
    {
        if(self = [super initWithAge:age])
        {
            _height = height;
        }
        return self;
    }
    

    自定义类工厂方法

    规范:
    1.一定是类对象方法
    2.名字以类名词开头,首字母小写
    3.一定有范围值,返回类型一定是id/instancetype
    例如:

    + (instancetype)person
    {
        return [[Person alloc] init];
    }
    Person *p = [self person]
    //----------------------------------------
    + (instancetype)personWithAge:(int)age
    {
        Person *p = [[self alloc] init];
        p.age = age;
        return p;
    }
    

    自定义构造方法和自定义类工厂方法是苹果的一个规范,一般情况下我们会用自定义构造方法和自定义类工厂方法创建一个对象
    注意:但凡以后用到自定义类工厂,在类工厂方法中创建对象一定一定要用self

    类的启动过程

    load方法

    在程序已启动时会自动执行load这个类方法,不管这个类方法是否调用都会执行,先执行父类load,再执行子类load

    +(void)load
    {
        NSlog(@"%s",__func__)
    }
    

    initialize方法

    当这个类方法第一次执行时,先执行父类initialize,再执行子类initialize

    +(void)initialize
    {
        NSlog(@"%s",__func__)
    }
    

    SEL类型

    代表着方法的签名,在类对象的方法的方法列表中存储着该签名的方法代码的对应关系
    作用:配合对象/类张有没有实现某一个方法

    SEL sel = @selector(xxx);
    BOOL flag = [p respondsTOSelector:sel];
    NSLog(@"%d",flag);
    

    作用2:配合对象/类调用一个方法

    SEL sel1 = @selector(xxx)
    [p perforSeletor:sel1]//不带参数
    [p perforSeletor:sel1 withObject:]//带参数
    //perforSeletor最多可以传递2个参数
    

    作用3:作为方法的形参

    -(void)run;
    SEL sel = @selector(run)
    -(void)makeObject:(id)obj andSel:(SEL)sel
    
    Car *c = [[Car alloc] init];
    Person *p = [[Person alloc] init];
    [Person makeObject:c andSel:run];
    //一个对象调用另一个对象的方法
    

    相关文章

      网友评论

        本文标题:关于OC动态数据类型 构造方法和类工厂等知识点的学习

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