NSObject和反射

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] 调用了Person的test方法

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

时间: 2024-10-13 00:13:26

NSObject和反射的相关文章

obj-c编程06:反射与元编程初步

    我们知道对于现如今的动态语言比如ruby而言,反射和元编程以及支持的非常灵活了,你完全可以跳过常规的手段,而利用反射来查询或调用对象的私有方法.而obj-c对反射的支持略显小繁琐,而且在开了ARC后同样出错.就算不开ARC,为啥明明有那个方法却不能调用呢?为啥double变量不让直接转成id呢?蛋疼啊,上代码: #import <Foundation/Foundation.h> @interface A:NSObject{ double i; } @property double i;

Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射

http://blog.csdn.net/shulianghan/article/details/48876843 这个漂亮的文字阴影,搞不到啊,求指教 一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber :  -- 通用包装类 NSValue : NSValue 包装单个 short, int, long, float, char, id, 指针 等数据; -- NSNumber 包装类 : 用于包装 C 语言数据类型; NSNu

ios开发之Swift - 反射(Reflection)的介绍与使用样例(附KVC介绍)

1,反射(Reflection) 对于C#.Java开发人员来说,肯定都对反射这个概念相当熟悉.所谓反射就是可以动态获取类型.成员信息,同时在运行时(而非编译时)可以动态调用任意方法.属性等行为的特性. 以Java上的两个知名框架(hibernate和spring)为例.hibernate的属性映射就是通过反射来赋值的,spring的bean的创建就是根据配置的class来反射构建的. 2,Objective-C 的 Runtime 在使用ObjC开发时很少强调其反射概念,因为ObjC的Runt

从反射看委托与事件 委托真的是一个类

关于委托与事件,网上介绍得非常之多,在此不再赘述,本人最近需要捣鼓一些委托,因而对委托进行一 定的寻根究底,故用反射把委托的成员揪出来,且看如下代码: delegate void DelegateDemo(); static event DelegateDemo delHandle; static void Main() { delHandle += new DelegateDemo(MyDelegate_delHandle); MemberInfo[] mis = delHandle.GetT

JAVA核心层--反射--动态代理

本文发表于2010年,时间较早,部分问题解释不是十分准确,所以需要进一步了解,请参看2012年版本: java之架构基础-动态代理&cglib 要在JAVA技术上突破普通的层面,并拥有一翻设计理念的高度,除了要有很好的设计思维之外,反射在适当的使用下,将会把框架做得非常清晰,并且代码编写也非常简便. 在面向对象的编程中,我们为什么要忌讳去大量使用if else switch语句,因为这样写是将逻辑硬编码了,JAVA的思想就是将其配置化,一旦可配置化后,就逐渐可管理化,并随着产品的成熟逐步实现自动

程序集和反射(二)

上篇文章主要介绍了程序集的内容:程序集和反射(一),时隔这么久,今天终于腾出点时间,把反射部分的知识点给整理一下,不把这个写完,心里总觉得有点堵.对于反射,我相信很多人跟LZ一个德行,不会,所以不用,不用,所以永远不会.      通过System.Reflection命名空间中的类已经System.Type,您可以获取有关已加载的程序集和在其中定义的类型(如类.接口.值类型)的信息.您也可以使用反射在运行时创建类型实例,以及调用和访问这些实例.      程序集包含模块,而模块包含类型,类型又

UIKit框架之NSObject

首先学习NSObject  // // ViewController.m // localization // // Created by City--Online on 15/5/15. // Copyright (c) 2015年 XQB. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (voi

Android中利用反射技术实现加减乘除

JAVA反射机制定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有 属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取 的信息以及动态调用对象的方法的功能称为java语言的反射机制. Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类: 在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和 方法:在运行时调用任意一个对象的方法:生成动态代理. 有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的

结合AJAX和反射Refrection,实现页面无刷执行函数体

ajax|函数|页面|执行 其实做这么个东西没什么具体用途,只是在看到这个帖子和这篇BLOG后来了兴趣,突发其想来试试能不能做个在线的编译器,顺便也研究下ajax和反射: ajax是看很长时间了,比较关注微软的开发包Atlas的动态,也有很多资源: ·MSDN的Atlas 网站 ·ASP.NET "Atlas" 官方网站 ·ASP.NET "Atlas" 预览文档 ·Atlas  快速入门教程 以上几个连接来自思归 的blog,看来他也很关心这项技术: 前面好长一段