OC语言学习

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

2017-01-17  本文已影响0人  Gerhard_Z

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];
//一个对象调用另一个对象的方法
上一篇下一篇

猜你喜欢

热点阅读