Objective-C中的多态、点语法和动态类型总结

一. 多态

1. 多态概念,定义

什么是多态:多态就是某一类事物的多种形态;

表现形式:  Animal *ani = [Dog new];

多态条件:1.有继承关系     2.有方法的重写

2.多态代码实现:

//实例化猫的对象

Animal *animal  = [Cat new]; //父类的指针指向子类对象;

[animal eat];

//实例化狗的对象

animal = [Dog new]; //父类的指针指向子类对象。

[animal eat];

3.多态注意点:

1) 如果存在多态,父类是可以访问子类特有的方法

假设子类Dog 有一个特有的方法bark

Animal *an2 = [Dog new];         //编译时看等号左边,运行时看等号右边

[(Dog*)an2 bark]; //把父类的指针,强制类型转换

2) 如果不存在多态,父类是不可以访问子类特有的方法的

Animal *an3 = [Animal new];

[(Dog*)an3 bark]; //错误的,不能强制转换

二.类对象

1,类的本质其实也是一个对象(类对象);

类对象

*类对象在程序运行时一直存在。

*类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等

*每一个对象都包含一个指向其类对象的isa指针。

2、类对象如何获取

通过实例对象获取

Dog *d1 = [Dog new];

Dog *d2 = [Dog new];

Class c =   [d1 class];

Class c2 = [d2 class];

通过类名获取(类名其实就是类对象)

Class c3 = [ Dog  class ];

因为类对象在整个程序中只存在一份,

所以 c = c2 = c3

3.类对象的使用

1)可以用来调用类方法 :

//获取类对象

Class c1 = [Person class];

//使用类对象调用类方法

[c1 test]; // test是一个+号方法

2)可以用来实例化实例对象, 并且调用对象方法

//获取类对象

Class c1 = [Person class];

//使用类对象创建实例对象

Person *p = [c1 new];

[p test];  // -test 调用对象方法

4. 类对象存储细节

通过打印地址分析测试:类对象存在数据段;

5.SEL类型

SEL是一种新的数据类型。和id、class一样。

Person *p = [Person new];

SEL s1 = @selector(test);

[p performSelector:s1];

三. 点语法

1. 传统setter, getter方法

-(void)setAge:(int)age{

_age = age;

}

-(int)age{

return _age;

}

2. 点语法

本质上展开之后相当于调用setter, getter方法

p.age = 10;  展开之后等价于   [p setAge:10];  // setter方法

NSString *name = p.age; 等价于NSString *name = [p name]; // getter方法

对象. 成员变量  展开之后到底是setter方法, 还是getter方法, 看在等号的左边还是右边,

如果是等号左边就是setter方法, 在等号右边是getter方法

3. 点语法陷阱 :

在set方法使用self.

- (void)setAge:(int)newAge {

self.age = newAge;

}

2、点语法注意

点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。

切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语 法。

四[email protected]和@synthesize

@property:

1,@property只能写在@interface @end中。

2,@property 用来自动生成成员变量age的get/set方法声明(xcode4.4以前) 。

3,xcode4.4以后property做了增强 不但帮助我们自动生成get/set方法的声明还帮助我们自动生成get/set方法的实现 。

4,告诉编译器,要生成的get/set方法声明的成员变量类型是int 。

5,如果没有手动声明成员变量,perperty会在.m文件中自动帮我们生成一个开头的成员变量

@synthesize:

1. @synthesize age; 表示生成.h中变量age的get和set方法的实现

2. @synthesize 给指定的实例变量赋值。

@synthesize age = _age;

注意;

如果是@synthesize的话, 变量名要先在.h文件中声明。

@property,@synthesize这两个可以配合使用,用于简化set和get方法的定义和实现。

重写setter, getter方法:

只能重写setter, 或者getter方法中的一个

如果重写两个会报错.

五.动态类型

1. 动态类型:

运行的时候确定的类型

2. 动态绑定:

动态绑定是基于动态类型的:

基于动态类型,在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也被完全确定,这就是动态绑定。

动态绑定所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。

3.  动态加载:

动态创建类Class,动态添加Class成员变量与成员函数,动态变量赋值与取值,动态函数调用等;

4.  内省(Introspection)是面向对象语言和环境的一个强大特性,Objective-C和Cocoa在这个方面尤其的丰富。

内省是对象揭示自己作为一个运行时对象的详细信息的一种能力。这些详细信息包括对象在继承树上的位置,对象是否遵循特定的协议,以及是否可以响应特定的消息。

1、isKindOfClass:Class

判断实例对象是否是这个类或者这个类的子类的实

例。

2、isMemberOfClass:Class

判断是否是这个类的实例。

3、+(BOOL) isSubclassOfClass:classObj

判断类是否是指定类的子类。

4、respondToSelector:selector

确定对象是否可以对某个SEL做出响应

5、+(BOOL) instancesRespondToSelector:

判断类是否有这个方法。此方法是类方法, 不能用在类的对象

6、conformsToProtocol:protocol

检查对象是否符合协议,是否实现了协议中所有的必选方法。

动态类型检测:

1. 判断某个对象是否是类的实例对象,或者子类的实例对象(对象和类)

isKindOfClass使用格式:[对象 isKindOfClass 类对象];

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

2. isMemberOfClass 判断对象是否是指定类的实例对象(对象和类)

格式:  [对象  isMemberOfClass: 类对象]

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

3、判断类是否是指定类的子类(类和类之间的关系)

格式: [类A isSubclassOfClass:类B];

BOOL isSub = [Dog isSubclassOfClass:[Animal class]];

时间: 2024-10-20 08:20:38

Objective-C中的多态、点语法和动态类型总结的相关文章

Objective - C中属性和点语法的使用

一.属性 属性是Objective—C 2.0定义的语法,为实例变量提供了setter.getter方法的默认实现能在一定程度上简化程序代码,并且增强实例变量的访问安全性 OC中的属性机制提供了便捷的设置和获取实例变量的方式,或者说属性提供了一个默认的设置器和访问器的实现:属性提供的方法是现实可配置的,属性的好处:相当于自己编写这一对方法,属性提供了一系列清晰分明的说明参数来定义设置器和访问器的行为,编译器可以根据你设置的说明参数为你生成相应的方法,减少你的代码量和维护工作量 设置器(sette

点语法和动态类型

点语法: 对象.属性名 注意:此时并不是直接访问实例变量,而是xcode看到点语法后,会自动替换成[p setAge: 18]方法, 当出现在左侧时则替换为[p age]的get方法 不能使用self.age会出现死循环 20)@property: @property是编译器的指令,告诉编译器声明属性的访问器方法 @synthesize是实现@property声明的get和set方法 当类型一致时,可以用@property age,weight来定义属性方法 默认的是: setAge:(int)

(转)Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等

本文转自http://blog.csdn.net/totogo2010/article/details/7714960 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断对象类型 -(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例 -(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例 ps:本篇新建的类主要用于熟悉本篇内容设计,未考虑内存管理因素. 我们试试这两个方法的使用. 1.新建Per

Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等

转自:著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享.请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢! 原创链接:http://blog.csdn.net/totogo2010/article/details/7714960/# 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断对象类型 -(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例 -(BOOL) isMembe

python 中的多态

动态语言的多态和静态语言c++等多态含义不太一样,c++中的多态就是参数数量和类型不同的方法就是不同方法,而动态语言中的多态其实值的是方法的寻找过程,即向右找到类(或者单件类),在类中找不到的话再找父类,一直在祖先链中找到或者找不到为止,先找到的就被调用: class MyClass(object): def fn(x): print ("This is the first fn") def fn(x,y): print ("This is the second fn&quo

objective C中继承、协议、分类和多态的实现

第一.objective C中继承的实现 在oc中只有实例变量会有权限控制,实例方法和类方法是没有权限控制的,这点与c++不同,OC默认的是protected,并且在声明权限控制时,没有分号 在OC中可以像C++一样用指针运算法来访问实例变量 Rectangle.h 文件代码: #import <Foundation/Foundation.h> @interface Rectangle : NSObject { int _width; int _height; } @property (non

c#中的多态 c#中的委托

相信大家都对面向对象的三个特征封装.继承.多态很熟悉,每个人都能说上一两句,但是大多数都仅仅是知道这些是什么,不知道CLR内部是如何实现的,所以本篇文章主要说说多态性中的一些概念已经内部实现的机理. 一.多态的概念 首先解释下什么叫多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性.换句话说,实际上就是同一个类型的实例调用"相同"的方法,产生的结果是不同的.这里的"相同"打上双引号是因为这里的相同的方法仅仅是看上去相同的方法,实际上它

C++基础 (8) 第八天 数组指针 模板指针 C语言中的多态 模板函数

1昨日回顾 2 多态的练习-圆的图形 3多态的练习-程序员薪资 4员工管理案例-抽象类和技术员工的实现 employee.h: employee.cpp: technician.h: technician.cpp: source.cpp: 5员工管理案例-销售和经理实现 修改employee.h: displayStatus不用虚函数了 salesman.h: salesman.cpp: manager.h: manager.cpp: 6员工管理案例-销售经理的实现 7 中午回顾 注意: 多继承

java中的多态

多态是什么 1:在面向对象的程序设计中,多态是继继承和封装之后的第三大特征. 2:base类和导出类中有相同方法时,先调导出类的方法. 3:多态的作用是消除base类和导出类的耦合: 多态产生的条件 1 存在继承关系 2子类重写base类方法 3base类的引用指向子类 class Aa{ public void f(){ System.out.println("A.f()"); } } class B extends Aa{ public void f(){//子类重写base类方法