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] 调用了Persontest方法

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

























本文转自蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366574,如需转载请自行联系原作者

相关文章
|
缓存 运维 Java
函数计算产品使用问题之如何在函数代码的根目录中执行命令
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
191 7
|
8天前
|
数据采集 人工智能 安全
|
4天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
298 164
|
3天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
307 155
|
11天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
842 6