不同的对象以自己的方式响应相同名称方法的能力称之为多态。
两个相同名字的函数,函数体不一样。
多态:一个对外接口,多个内在实现。
静态绑定 在编译时就能确定调用哪个类里面的成员函数。
id是OC里的万能指针。
可以指向任意类型。
动态绑定,在运行时才能确定调用哪个类的成员函数。
id 类型是动态对象
静态类型。
如果不涉及到多态,尽量使用静态类型。
静态类型优点
1在编译阶段(而不是运行阶段)抛出错误。
2,能够提高程序的可读性
id frac;
和
Fraction *frac;
哪个可读性强?
一、根据类名或对象生成一个class-object,可以发送class消息。 类的索引或(编号)
[Square class] //通过类名声明。 (类方法)
[mysquare class] //通过对象名声明。(实例方法)
判断两个对象是否在一个类
if( [obj1class]==[obj12 class])
1.对象是不是class-object或其子类的成员?
-(BOOL)isKindofclass:class-object kind(种类,性质的)
//isKindOf是否为class-object或其父类的对象。
if ([mySquareisKindOfClass:[Squareclass]]==YES)
{
NSLog(@"mySquare is a member of Square class");
}
if ([mySquareisKindOfClass:[Rectangleclass]]==YES)
{
NSLog(@"mySquare is a member of Rectangle class");
}
if ([mySquareisKindOfClass:[NSObjectclass]]==YES)
{
NSLog(@"mySquare is a member of NSObject class");
}
2.对象是不是class-object的成员?
-(BOOL)isMemberofclass: class-0bject member(成员,会员)
if ([mySquareisMemberOfClass:[Squareclass]]==YES)
{
NSLog(@"mySquare is a member of Square class");
}
if ([mySquareisMemberOfClass:[Rectangleclass]]==YES)
{
NSLog(@"mySquare is a member of Rectangle class");
}
if ([mySquareisMemberOfClass:[NSObjectclass]]==YES)
{
NSLog(@"mySquare is a member of NSObject class");
}
3.某一个类是否指定类的子类。 判断类和类之间的关系
+(BOOL)subclassofclass:class-object subclass(子集)
if ([SquareisSubclassOfClass:[Rectangleclass]]==YES)//类方法,用类名用调用。
{
NSLog(@"Square is a subclass of a Rectangle");
}
上面三个是判断 类和对象的关系。
下面是对象和类成员函数之间的关系。
@selector 指令 selector(选择器,挑战者)
为某个方法生成一个SEL值。
@selector(alloc)
@seclctor(setTo:over:)
SEL action=@selector (draw);
与selector有关的方法:
1,类是否能响应selector指定的方法
+(BOOL)instanceRespondSelector:selector instance(实例,情况,建议), respond(回答,响应)
if ([RectangleinstancesRespondToSelector:@selector(setSide:)]==YES)
{
NSLog(@"Instances of Rectangle responds to setSide:method");
}
if ([SquareinstancesRespondToSelector:@selector(setSide:)]==YES)
{
NSLog(@"Instances of Square responds to setSide:method");
}
2,对象是否能响应selector指定的方法
-(BOOL)respondsToSeletor:selector
if ([mySquarerespondsToSelector:@selector(setSide:)]==YES )
{
NSLog(@"mySquare responds to setSide:method");
}
if ([mySquare respondsToSelector:@selector(setWidth:andHeight:)]==YES)
{
NSLog(@"mySquaer responds to setWidth:andHeight:");
}
if ([SquarerespondsToSelector:@selector(alloc)]==YES)//Square是类名,即是类方法,也是实例方法。
{
NSLog(@"Square responds to alloc method");
}
3.应用selector指定的方法
-(id)Performselector:selector perform(执行,完成)
//实例方法,对象调用的。selector指定的方法
[mySquare performSelector:@selector(setSide:) withObject:(id)5];
NSLog(@"side is:%i",(int)[mySquare performSelector:@selector(side)]);