LHF Objective-C语法(7)id类型、动态判断与选择器

1、id类型

number先指向frac实例,调用了他的print方法,然后指向comp实例,调用了他的print

2、动态判断与选择器

假如别人传递给你一个id,你如何动态判断这个在运行时传递过来的对象到底有没有xxx方法那?

其实NSObject中有一系列这样的方法用于动态判断,类似java的反射机制

      -(BOOL)isMemberOfClass:(Class)  clazz //判断对象是否是clazz的实例,不包含子类的实例

     -(BOOL)isKindOfClass:(Class) clazz //判断对象是否是clazz的实例或子类的实例

     -(BOOL)respondsToSelector:(SEL) selector //判断类型或对象是否能够回应某个方法,这个方法使用选择器表示

     +(BOOL)instancesRespondToSelector:(SEL) selector//判断类型所产生的实例是否能够回应某个方法,这个方法使用选择器表示

     -(id)performSelector:(SEL) selector //用于动态调用类型或者对象上的一个方法

解释:

      SEL类型,用于表示objc的一个方法

      @selector(方法名)   例如:@selector(initWithWidth:andHeight:)不要丢掉冒号啊

      Class id  SEL 前不需要加星号



4、类别

想扩充一个类的功能,但有不想使用继承,就可以选择类别

写一个Fraction的类别,为Fraction类增加两个方法


注意:

类别不可以声明新的实例变量,而且一旦你定义的方法与原始类中的方法名相同,那么原始方法将被隐藏起来

因为不是继承结构,你不能在类别中的方法使用super激活原始类的同名方法

类别还有一个功能,就是隐藏方法,我们在Fraction.m的最后增加如下方法

@interface Fraction(Math3)

-(Fraction*)sub:(Fraction*)f;//减法

@end


@implementation Fraction(Math3)

-(Fraction*)sub:(Fraction*)f{

return [[Fraction alloc] initWithNumerator:

numerator*[f denominator]-denominator*[f numerator]

denominator:denominator*[f denominator]];

}

@end

在。m文件中定义@interface?是的,因为@interface一旦定义在。m文件中,它就不能以header文件形式被导入到其他的类里了,

也就是这样的@interface中定义的方法相当于隐藏了,只有zhege。m编译单元内看见

}

posted @ 2012-02-14 14:54  大鱼大鱼  阅读(1312)  评论(0编辑  收藏  举报