NSObject和反射
来源:互联网 发布:打字员软件 编辑:程序博客网 时间:2024/05/19 02:19
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
- NSObject和反射
- NSObject和反射 --foundation
- foundation-NSObject和反射
- NSObject常用方法 和反射
- NSObject常用方法 和 常用的一些类的反射
- NSObject一些比较常用的方法和简单的反射
- ObjectC----NSObject常用方法和OC反射机制
- NSObject常用方法 和 常用的一些类的反射
- NSObject常用方法 和 常用的一些类的反射
- NSObject,反射,copy笔记
- Objective-C之Foundation框架的NSObject和反射机制的应用
- 黑马程序员——foundation框架之NSNull,NSObject和反射
- id和instancetype和NSObject
- NSObject
- NSObject
- NSObject
- NSObject
- NSObject
- linux下安装配置R环境相关依赖包
- HDU 1257 最少拦截系统
- 25个增强iOS应用程序性能的提示和技巧--中级篇
- 查找窗口的几种方法
- uva 10494 大数
- NSObject和反射
- VLC播放器所需的SPS,PPS获取方法
- Oracle 转义HTML特殊字符
- 我的独立面对
- JDBC执行Oracle传入参数为集合对象的存储过程
- 谷歌技术"三宝"之BigTable
- wamp建立多个目录挂多个网站
- 编程中使用的命名习惯
- Delphi 中的常用事件