搜索
您的当前位置:首页正文

二、Object-C 对象的类型和动态绑定

来源:二三娱乐

一、动态绑定

OC中在执行selector时才会去绑定,运行过程如下:
1、确定接收者类型(动态绑定)
2、根据消息名,在类的方法列表中寻找,如果没有就到父类中寻找,若找到NSObject都没有找到方法就上报不能识别消息的错误。

二、多态

同一操作,作用于不同类的实例时,将产生不同的执行结果。即:不同的类可以有相同的message

三、nil

1、nil表示一个空的对象
2、alloc方法会把数值类型的的变量初始化为0,对象,id和其它类型的指针被初始化为nil
3、OC中可以省略 “!= nil” ,例如:

- (instancetype)init
{
    self = [super init];
    if (self) {
        // dosomething
    }
    return self;
}

4、给一个为nil的对象发消息,写法有效,运行时不会有任何作用,message selector方法也不会执行,如果selector有返回值,代码执行的时候根据返回的类型返回空对象。
对象 - nil、指针类型 - NULL、整数类型 - 0、如果是结构体或者实数 - 返回值未定义(通常是MAC_OS的版本以及结构体的大小等相关)

四、静态类型检查

1、将一个变量声明为一个特定的类型对象,此叫静态类型。编译时会进行类型检查。调用父类方法编译器会警告。父类型不能赋值给子类型。
2、id数据类型可以存储任何类型的对象,编译时不会进行类型检查。不能通过“->”调用变量
3、强制转换换“(NSString *)”
4、判断到底哪个类的方法被执行了,不看变量声明的类,看实际执行时这个变量的类型
5、id并不是(NSObject *)

五、类的前置声明

使用import导入一个类时(#import "Student.h”),还可能会导入别的类。如果只想“在类型定义的时候”使用以下类名。可以用@class方法。
@class NSString,NSMutableArray;

六、访问器

变量默认是procted受保护的,类之外无法访问,说声明为@public才可访问

@public int _age;
Student * s = [[Student alloc] init];
s->_age = 10;

因为默认受保护,所以需要添加setter和getter方法,这里只是简写了声明,还需要写实现,实现省略(就是普通的赋值操作)。

int _age;
- (void)setAge:(int)age;
- (int)age;
Student * s = [[Student alloc] init];
s.age = 10;//添加setter和getter方法后可以用“.”访问,实际就是访问的setter/getter方法

static修饰函数或变量,之作用于定义的文件本身,其它文件不能访问,例如子类不能访问,除非添加setter/getter方法。

七、变量可见性

@private 私有,声明它的类可以访问,子类不能访问,类方法中可以->访问,其它类不能访问
@protected 受保护的,默认,声明它的类和子类可访问,其它类不能访问
@public 本类和其它类可以直接访问
@package 所在框架

.m文件即实现部分定义的变量,只能本类访问,不能子类访问,因为没有在.h中声明。

八、实例方法,类方法

定义方法之前都又一个“+”或者“-”,-代表实例方法,+ 代表类方法。
- (int)name;
+ (id)getClassName;

1、类方法
[Student name];//类方法直接用类调用,不需要实例

2、实例方法
Student * s = [[Student alloc] init];
[s name]; //s是一个实例,它只能调用实例方法

3、只有实例变量,实例方法和类方法。没有实例变量也就是静态成员变量。因为其它地方不能访问所以就不支持静态成员变量,可以变相的在.m文件中定义static变量加上setter/getter访问来实现这个效果。

九、instancetype

instancetype 代表返回的是一个当前的类对象

- (instancetype)init
{
    self = [super init];
    if (self) {
        // dosomething
    }
    return self;
}

所有init方法为啥用instancetype不用Student,因为你有可能派生一个新的类,如果返回固定为Student,派生的类没有复写init方法的话返回的就是一个Student,所以返回一个instancetype代表返回的是一个当前的类对象,最早OC是用的id,incstancetpe更好,明确返回当前的类对象。

Top