NSObject和反射

简介: Person.h: #import @interface Person : NSObject@property(nonatomic,retain) NSString * name;-(void) test;@end Person.

Person.h:

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property(nonatomic,retain) NSString * name;

-(void) test;
@end

Person.m:

#import "Person.h"

@implementation Person

+(id)personWithName:(NSString *)name{
    Person *person=[[[Person alloc] init] autorelease];
    person.name=name;
    return person;
}

-(void)test{
    NSLog(@"调用了Person的test方法");
}

-(NSString *)description{
    return self.name;
}

-(id)alloc{
    [_name release];
    [super alloc];
}
@end

Student.h:

#import "Person.h"

@interface Student : Person
-(void) test;
-(void) test2:(NSString *)a;
//-(void) test3:(NSString *)a withPer:(NSString *)b;
@end

Student.m:

#import "Student.h"

@implementation Student
-(void)test{
    NSLog(@"调用了test方法");
}
-(void)test2:(NSString *)a{
    NSLog(@"调用了test2方法,参数%@",a);
}
//-(void)test3:(NSString *)a withPar:(NSString *)b{
//    NSLog(@"带有两个参数的方法,参数1%@,参数2%@",a,b);
//}
@end

main:

#import <Foundation/Foundation.h>
#import "Student.h"
#import "Person.h" //由于Student继承自Person,所以这儿可以不需要导入Person.h,但import导入的时候,会先进行判断,然后在导入头文件,不会出现重复导入的状况

void NSObjectCreate(){
    //判断是否是某一个类
    id *stu=[[[Student alloc] init] autorelease];
    if([stu isKindOfClass:[Person class]]){ //判断是否是Student类或者是否继承自Person类
        NSLog(@"stu是Student类或者是继承自Person类");
    }
    else
        NSLog(@"不是");

    //如果用[stu isMemberOfClass:]这种方法只能判断是否是属于这个类,如果是子类则返回no,这个判断范围没有上面那种方法大
    BOOL * result=[stu isMemberOfClass:[Person class]];
    NSLog(@"是否是这个类:%i",result);


    Student *student=[[[Student alloc] init] autorelease];
    //直接调用方法
    [student test];
    //间接调用方法
    [student performSelector:@selector(test)]; //调用无参方法
    //如果调用有参方法要特别注意,调用的这个函数的参数类型不能是基本数据类型,就算我们将要传的参数封装成基本OC对象的NSNumber,但OC不支持自动解包,所以要确保调用的方法它的参数是OC对象
    [student performSelector:@selector(test2:) withObject:@"3"];
    //调用带有两个参数的方法,但是注意,没有调用两个参数及以上的方法
    //[student performSelector:@selector(test2) withObject:@"1" withObject:@"2"];

    //使用定时器,延迟两秒调用test2
    [student performSelector:@selector(test2:) withObject:@"1" afterDelay:2];//延迟2秒钟带调用调用这个方法,注意:由于主函数都结束了,所以看不到延迟调用这个方法的执行
}
#pragma mark - 反射
void reflect(){
    //类名的反射(字符串变成类名)
    NSString *str=@"Person";
    Class class=NSClassFromString(str);
    Person *person=[[[class alloc] init] autorelease];
    person.name=@"dingxiaowei";
    NSLog(@"%@",person);


    //类名变成字符串
    NSString * strClass= NSStringFromClass([Person class]);
    NSLog(@"%@",strClass);

    //方法的反射
    NSString *method=@"test";
    SEL selector=NSSelectorFromString(method);
    [person performSelector:selector];
    //selector变成字符串
    str=NSStringFromSelector(selector);
    NSLog(@"%@",str);
    
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        //NSObjectCreate();
        reflect();
    }
    return 0;
}

结果:

2013-08-02 15:22:21.727 NSObject[1072:303] dingxiaowei

2013-08-02 15:22:21.728 NSObject[1072:303] Person

2013-08-02 15:22:21.729 NSObject[1072:303] 调用了Persontest方法

2013-08-02 15:22:21.729 NSObject[1072:303] test


相关文章
|
9月前
|
Java API
Java反射(通过反射获取构造函数、方法、属性)
1.通过反射获取构造函数,2.通过反射获取方法,3.通过反射调用成员属性
85 0
|
9月前
|
Java
Java 类(私有属性、对象方法、类方法,构造函数)
Java 类(私有属性、对象方法、类方法,构造函数)
77 0
|
Java 开发者
反射实例化对象|学习笔记
快速学习反射实例化对象
129 0
反射实例化对象|学习笔记
如何通过反射创建对象?
方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance() 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.
1262 0
|
iOS开发
NSObject类了解
今天看一本书,偶然间看到关于继承的那一章。上面有一句话是这么说的:在OC中,允许定义自己的根类,但通常不这么做,而是希望利用现有的类。因此,我们所定义的类都是属于NSObject根类的派生类。
948 0
C# 反射通过类名实例化类
在面向对象编程的时候,会遇到这样的问题,一个父类有多个子类,需要创建一个父类的对象,再后面根据条件去把该对象实例化具体的某个子类,然后进行操作。
1900 0