http://www.linuxidc.com/Linux/2012-07/64453.htm
1、新建Person类继承NSObject,新建Teacher类继承Person
1.1、新建Person类
- #import<Foundation/Foundation.h>
- @interfacePerson:NSObject
- {
- NSString*name;
- }
- -(void)setName:(NSString*)n;
- @end
- #import"Person.h"
- @implementationPerson
- -(void)setName:(NSString*)n
- {
- name=n;
- }
- @end
1.2新建Teacher类
- #import"Person.h"
- @interfaceTeacher:Person
- -(void)teach;
- @end
- #import"Teacher.h"
- @implementationTeacher
- -(void)teach
- {
- NSLog(@"我教数学");
- }
- @end
1.3 我们先实验下isMemberOfClass方法。
- NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
- Person*person=[[Personalloc]init];
- Teacher*teacher=[[Teacheralloc]init];
- //YES
- if([teacherisMemberOfClass:[Teacherclass]]){
- NSLog(@"teacherTeacher类的成员");
- }
- //NO
- if([teacherisMemberOfClass:[Personclass]]){
- NSLog(@"teacherPerson类的成员");
- }
- //NO
- if([teacherisMemberOfClass:[NSObjectclass]]){
- NSLog(@"teacherNSObject类的成员");
- }
- [personrelease];
- [teacherrelease];
- [poolrelease];
打印结果:
2012-07-04 14:23:07.965 ObjectiveCTest[2460:f803] teacher Teacher类的成员
只有第一个判断打印出来,isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管。
1.4isMemberOfClass方法
- NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
- Person*person=[[Personalloc]init];
- Teacher*teacher=[[Teacheralloc]init];
- //YES
- if([teacherisKindOfClass:[Teacherclass]]){
- NSLog(@"teacher是Teacher类或Teacher的子类");
- }
- //YES
- if([teacherisKindOfClass:[Personclass]]){
- NSLog(@"teacher是Person类或Person的子类");
- }
- //YES
- if([teacherisKindOfClass:[NSObjectclass]]){
- NSLog(@"teacher是NSObject类或NSObject的子类");
- }
- [personrelease];
- [teacherrelease];
- [poolrelease];
2012-07-04 14:34:17.315 ObjectiveCTest[2595:f803] teacher是Teacher类或Teacher的子类
2012-07-04 14:34:17.316 ObjectiveCTest[2595:f803] teacher是Person类或Person的子类
2012-07-04 14:34:17.316 ObjectiveCTest[2595:f803] teacher是NSObject类或NSObject的子类
三个结果都打印出来了。2、
-(BOOL) respondsToSelector: selector 判读实例是否有这样方法+(BOOL) instancesRespondToSelector: 判断类是否有这个方法。此方法是类方法,不能用在类的对象
2.1respondsToSelector的使用
这里不写对象的创建和释放了,参考上面的代码
- //YES
- if([teacherrespondsToSelector:@selector(setName:)]==YES){
- NSLog(@"teacherrespondstosetSize:method");
- }
- //NO
- if([teacherrespondsToSelector:@selector(abcde)]==YES){
- NSLog(@"teacherrespondstononExistantmethod");
- }
- //YES
- if([TeacherrespondsToSelector:@selector(alloc)]==YES){
- NSLog(@"teacherclassrespondstoallocmethod\n");
- }
2012-07-04 14:39:49.853 ObjectiveCTest[2723:f803] teacher responds to setSize: method
2012-07-04 14:39:49.854 ObjectiveCTest[2723:f803] teacher class responds to alloc method
中间的那个判断我随便写了个selector,当然没有了。respondsToSelector 检查类方法 alloc返回YES
2.2instancesRespondToSelector
- //NO
- if([PersoninstancesRespondToSelector:@selector(teach)]==YES){
- NSLog(@"Personinstancerespondstoteachmethod");
- }
- //YES
- if([TeacherinstancesRespondToSelector:@selector(teach)]==YES){
- NSLog(@"Teacherinstancerespondstoteachmethod");
- }
- //YES
- if([TeacherinstancesRespondToSelector:@selector(setName:)]==YES){
- NSLog(@"TeacherinstancerespondstosetName:method");
- }
- 2012-07-0414:52:29.378ObjectiveCTest[2961:f803]Teacherinstancerespondstoteachmethod
- 2012-07-0414:52:29.379ObjectiveCTest[2961:f803]TeacherinstancerespondstosetName:method
3、Objective-C的id类型
C++ 使用的是强类型:对象必须符合其类型,否则不能通过编译。在 Objective-C 中,id类型类似于(void*) ,可以指向任何类的实例。而不需要强制转换。
下面看看使用,
先把Teacher类中的 teach方法修改一下,改成
-(void)teach
{
NSLog(@"%@教数学",name);
}
然后实现并调用- NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
- Person*person=[[Personalloc]init];
- Teacher*teacher=[[Teacheralloc]init];
- idp=person;
- idt=teacher;
- [tsetName:@"张三老师"];
- [tteach];
- [personrelease];
- [teacherrelease];
- [poolrelease];
- 2012-07-0414:57:55.905ObjectiveCTest[3085:f803]张三老师教数学