美文网首页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动态数据类型 构造方法和类工厂等知识点的学习

    iOS学习笔记整理 @property @property 是一个编译器的指令它可以代替生成getter/sett...

  • 反射

    反射的作用① 动态的加载类、动态的获取类的信息(属性,方法,构造方法) ② 动态构造对象 ③ 动态调用类和对象的任...

  • OC编程

    OC语言学习路线及重难点 关键字 数据类型 对象存储细节 Xcode文档安装和自定义代码段 动态数据类型id 构造...

  • OC运行时

    我个人对OC的理解就是:动态获取OC Class的属性和方法,从而动态改变Class方法和属性。之前学习Java的...

  • Spring学习笔记

    Spring实例化bean1、构造方法实例化bean 2、使用静态工厂实例化 类中的静态方法如下: 3、使用动态工...

  • 1.6:避免创建不必要的对象

    ① 不可变类,采用静态工厂方法 对于不可变类,若同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂而不...

  • 浅谈GoF23设计模式-“FactoryMethod”模式

    “FactoryMethod”模式简介:工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类...

  • 工厂方法模式

    一、工厂方法模式概述 工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的...

  • EffectiveJava第2章-创建和销毁对象

    第1条:考虑使用静态工厂方法代替构造器 获取类实例的两种方法:公有的构造器、公有的静态工厂方法返回类的实例。 静态...

  • JS创建对象和实现继承的方式

    前端知识点: 一、创建对象的方式 工厂模式、构造函数模式、原型模式、组合使用构造函数模式和原型模式、动态原型模式、...

网友评论

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

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