点语法和动态类型

本文详细介绍了Objective-C中的属性声明与实现方法,包括@property和@synthesize的使用,以及动态类型的特性,如多态、动态绑定等。通过具体示例说明如何判断对象是否能响应指定方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点语法:

对象.属性名

 注意:此时并不是直接访问实例变量,而是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值