main:

1 // 2 // main.m 3 // NSObject 4 // 5 // Created by dingxiaowei on 13-5-19. 6 // Copyright (c) 2013年 dingxiaowei. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 #import "Student.h" 11 #import "Person.h" //由于Student继承自Person,所以这儿可以不需要导入Person.h,但import导入的时候,会先进行判断,然后在导入头文件,不会出现重复导入的状况 12 13 void NSObjectCreate(){ 14 //判断是否是某一个类 15 id *stu=[[[Student alloc] init] autorelease]; 16 if([stu isKindOfClass:[Person class]]){ //判断是否是Student类或者是否继承自Person类 17 NSLog(@"stu是Student类或者是继承自Person类"); 18 } 19 else 20 NSLog(@"不是"); 21 22 //如果用[stu isMemberOfClass:]这种方法只能判断是否是属于这个类,如果是子类则返回no,这个判断范围没有上面那种方法大 23 BOOL * result=[stu isMemberOfClass:[Person class]]; 24 NSLog(@"是否是这个类:%i",result); 25 26 27 Student *student=[[[Student alloc] init] autorelease]; 28 //直接调用方法 29 [student test]; 30 //间接调用方法 31 [student performSelector:@selector(test)]; //调用无参方法 32 //如果调用有参方法要特别注意,调用的这个函数的参数类型不能是基本数据类型,就算我们将要传的参数封装成基本OC对象的NSNumber,但OC不支持自动解包,所以要确保调用的方法它的参数是OC对象 33 [student performSelector:@selector(test2:) withObject:@"3"]; 34 //调用带有两个参数的方法,但是注意,没有调用两个参数及以上的方法 35 //[student performSelector:@selector(test2) withObject:@"1" withObject:@"2"]; 36 37 //使用定时器,延迟两秒调用test2 38 [student performSelector:@selector(test2:) withObject:@"1" afterDelay:2];//延迟2秒钟带调用调用这个方法,注意:由于主函数都结束了,所以看不到延迟调用这个方法的执行 39 } 40 #pragma mark - 反射 41 void reflect(){ 42 //类名的反射(字符串变成类名) 43 NSString *str=@"Person"; 44 Class class=NSClassFromString(str); 45 Person *person=[[[class alloc] init] autorelease]; 46 person.name=@"dingxiaowei"; 47 NSLog(@"%@",person); 48 49 50 //类名变成字符串 51 NSString * strClass= NSStringFromClass([Person class]); 52 NSLog(@"%@",strClass); 53 54 //方法的反射 55 NSString *method=@"test"; 56 SEL selector=NSSelectorFromString(method); 57 [person performSelector:selector]; 58 //selector变成字符串 59 str=NSStringFromSelector(selector); 60 NSLog(@"%@",str); 61 62 } 63 64 int main(int argc, const char * argv[]) 65 { 66 67 @autoreleasepool { 68 //NSObjectCreate(); 69 reflect(); 70 } 71 return 0; 72 }
Person:

1 // 2 // Person.m 3 // NSObject 4 // 5 // Created by dingxiaowei on 13-5-19. 6 // Copyright (c) 2013年 dingxiaowei. All rights reserved. 7 // 8 9 #import "Person.h" 10 11 @implementation Person 12 13 +(id)personWithName:(NSString *)name{ 14 Person *person=[[[Person alloc] init] autorelease]; 15 person.name=name; 16 return person; 17 } 18 19 -(void)test{ 20 NSLog(@"调用了Person的test方法"); 21 } 22 23 -(NSString *)description{ 24 return self.name; 25 } 26 27 -(id)alloc{ 28 [_name release]; 29 [super alloc]; 30 } 31 @end
Student:

1 // 2 // Student.m 3 // NSObject 4 // 5 // Created by dingxiaowei on 13-5-19. 6 // Copyright (c) 2013年 dingxiaowei. All rights reserved. 7 // 8 9 #import "Student.h" 10 11 @implementation Student 12 -(void)test{ 13 NSLog(@"调用了test方法"); 14 } 15 -(void)test2:(NSString *)a{ 16 NSLog(@"调用了test2方法,参数%@",a); 17 } 18 //-(void)test3:(NSString *)a withPar:(NSString *)b{ 19 // NSLog(@"带有两个参数的方法,参数1%@,参数2%@",a,b); 20 //} 21 @end