NSObject和反射

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 }
View Code

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
View Code

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
View Code
原文地址:https://www.cnblogs.com/dingxiaowei/p/3086988.html