点语法和动态类型

点语法:

对象.属性名

 注意:此时并不是直接访问实例变量,而是xcode看到点语法后,会自动替换成[p setAge: 18]方法, 当出现在左侧时则替换为[p age]的get方法

 不能使用self.age会出现死循环

20)@property:

@property是编译器的指令,告诉编译器声明属性的访问器方法

 @synthesize是实现@property声明的get和set方法

 当类型一致时,可以用@property age,weight来定义属性方法

 默认的是:

 setAge:(int) age{

    self->age = age;

 }

 @synthesize指定实例变量赋值

 @synthesize age = _age, weight = _weight;

 当指定实例变量名之后,此时不会生成也不会再操作默认实例变量了

 展开为:

 -(void)setAge(int) age{

    _age = age;

 }

 -(void)age{

    return _age;

 }

 xcode4.4之后可以只使用@property 而不使用@synthesize(get方法和set方法可以在.m中手动实现,但不能同时手动实现)

 声明和实现了 _age, _name的get和set方法,操作的是带有下划线的实例变量

 如果我们当前类没有下划线的实例变量,则系统会帮我们自动生成,并且不会被子类继承

21)动态类型:

多态:允许不同类定义相同方法

 动态类型:程序直到执行时才能确定所属的类

 静态类型:将一个变量定义为特定类的对象时,使用的是静态类型

 动态绑定:在oc中一个对象内是否调用指定的方法不是由编译器决定而是由运行时决定,这被称作方法的动态绑定

 -(BOOL)isKindOfClass:classObj  判断实例对象是否是这个类或这个类点子类的实例对象

 BOOL isinstance = [ani isKindOfClass: [Animal class]];

 -(BOOL)isMemberOfClass:classObj判断是否是这个类的实例,不管是这个类子类的实例

 isInstance = [dog isMemberOfClass:[Animal class]];

 +(BOOL)isSubclassOfClassObj判断类是否是指定类的子类(注意是类不是对象啊,参数必须是class类型)

 isInstance = [dog isSubclassOfClass:[Animal class]];

 -(BOOL)respondsToSelector:selector 判断实例是否有这样的方法

 SEL s1 = @selector(eat);  //把eat包装成SEL类型

 判断实例对象能否响应(调用)指定方法:

 BOOL isRespond = [ani respondToSelector:s1];

 判断类能否响应(调用)指定方法:

 isRespond = [Dog instancesRespondToSelector:s1]; 或下面这种

 isRespond = [Dog instancesRespondToSelector:@selector(run)];

 响应方法:

 if([ani respondsToSelector:@selector(eat)]){

//[(Dog*)ani eat];

[ani performSelector:s1];(作用,响应方法)

 }else{

NSLog(@"该对象不能调用此方法");

 }

原文地址:https://www.cnblogs.com/coolcold/p/4674378.html