Objective-C中的反射和反射工厂

   2023-02-07 学习力0
核心提示: 本文为原创,欢迎转载和收藏,转载请标明原文地址   程序中可能会出现大量的if-else或者switch-case来选择一系列类中的某个类进行操作,利用反射(Reflection)就可以避免这些重复判断工作。  反射在Java中封装了类来实现,在Objective-C里面要自己来实

 本文为原创,欢迎转载和收藏,转载请标明原文地址


 

  程序中可能会出现大量的if-else或者switch-case来选择一系列类中的某个类进行操作,利用反射(Reflection)就可以避免这些重复判断工作。

  反射在Java中封装了类来实现,在Objective-C里面要自己来实现,好在不是很难。

  我们的目的是通过传入一个类名字符串,把字符串类名动态转化成类,并对类进行实例化和调用方法等操作。

 

  OC的NSRuntime中提供了将Class name转化为Class的方法"NSClassFromString()"

 

NSClassFromString //方法原型
Class NSClassFromString (
   NSString *aClassName
);

 

   因此,我们就可以这样使用来动态获得一个类:

NSString * aClassName = @"SunnyClass";
Class class = NSClassFromString(aClassName);

 

  这样我们就能实例化这个类了:

id instance = [[class alloc] init];

 

  如果需要使用方法,最好用reponseToSelector:来检测一下

if([instance reponseToSelector:@selector(aMethod)])
{
    [instance aMethod];
}

 

  这样就完成了反射调用的过程。

  下面就是将反射利用到工厂模式里。

 

  定义一个Fruit,和三种继承自Fruit的水果

@interface Fruit : NSObject
- (void)show;
@end

@interface Apple : Fruit 
@end

@interface Banana : Fruit 
@end

@interface Pear : Fruit 
@end

 

  实现部分,简单的show方法来打印

@implementation Fruit
- (void)show
{
    NSLog(@"I'm a fruit");
}
@end

@implementation Apple
- (void)show
{
    NSLog(@"I'm an apple");
}
@end

@implementation Banana
- (void)show
{
    NSLog(@"I'm a banana");
}
@end

@implementation Pear
- (void)show
{
    NSLog(@"I'm a pear");
}
@end

 

  如果使用传统的if-else分支判断的话,情况就会变得非常恶心,如果想再增加一个Orange类的话,不仅需要增加Orange类的代码,工厂的代码也要新增加else-if分支:

- (Fruit *)createFruitWithName:(NSString *)fruitName
{
    Fruit * theFruit;
    if ([fruitName isEqualToString:@"Apple"]) 
    {
        theFruit = [[[Apple alloc] init] autorelease];
    }
    else if ([fruitName isEqualToString:@"Banana"])
    {
        theFruit = [[[Banana alloc] init] autorelease];
    }
    else if ([fruitName isEqualToString:@"Pear"])
    {
        theFruit = [[[Pear alloc] init] autorelease];
    }
    return theFruit;
}

 

  但如果使用反射工厂的模式,情况就变得简单了许多,扩展性也会变得更好(反射输入的类名最好能来自于一个文件,这个文件规定了哪些字符串是可以作为参数传入的,这里就不考虑了)

@implementation FruitFactroy

- (Fruit *)createFruitWithName:(NSString *)fruitName
{
    //通过string得到类的结构体
    Class class = NSClassFromString(fruitName);
    
    //通过转化的class得到实例对象
    Fruit * theFruit = [(Fruit *)[[class alloc] init] autorelease];
    
    //调用对象方法
    if ([theFruit respondsToSelector:@selector(show)]) 
    {
        [theFruit show];
    }
    
    //返回对象
    return theFruit;
}
@end

 

  工厂方法的调用

    FruitFactroy * factroy = [[[FruitFactroy alloc] init] autorelease];
    Fruit * apple = [factroy createFruitWithName:@"Apple"];
    Fruit * banana = [factroy createFruitWithName:@"Banana"];
    Fruit * pear = [factroy createFruitWithName:@"Pear"];

 

 

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 《黑马程序员》 category分类的使用(Objective
    分类的作用:在不改变原来类的基础上,可以给类增加一些方法。使用注意 : ①  分类只能增加方法,不可以增加成员变量                ②  分类的方法在实现中可以访问成员变量,不过成员变量必须手动实现。               
    03-16
  • Objective-C学习—UIScrollView控件使用
    Objective-C学习—UIScrollView控件使用
    一、知识点简单介绍1.UIScrollView控件是什么?(1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限(2)当展⽰示的内容较多,超出⼀一个屏幕时,⽤用户可通过滚动⼿手势来查看屏幕以外的内容(3)普通的UIView不具备滚动功能
    03-16
  • Objective-C Runtime(转)
    博主地址: http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/曾经觉得Objc特别方便上手,面对着 Cocoa 中大量 API,只知道简单的查文档和调用。还记得初学 Objective-C 时把[receiver message]当成简单的方法调用,而无视了“发送消息”这句话
    03-08
  • iOS扩展——Objective-C开发编程规范 简单io扩展实验代码
    iOS扩展——Objective-C开发编程规范 简单io扩
      最近准备开始系统学习一个完整项目的开发流程和思路,在此之前,我们需要对iOS的开发变成规范进行更系统和详尽的学习,随意对编程规范进行了整理和学习。本文内容主要转载自:Objective-C-Coding-Guidelines-In-Chinese  此外,这篇文章所说的一些常见
    03-08
  • Objective-C利用协议实现回调函数
    实现一个显示文字为测试的视图,然后经过3秒钟测试文字变为回调函数文字。相应的截图如下:  实现的代码如下:定义协议:#import UIKit/UIKit.h @protocol NoteDelegate //回调函数 -(void)messageCallBack:(NSString *)string; @end 调用协议:#impor
    02-10
  • 刨根问底Objective-C Runtime(1)- Self & S
      刨根问底Objective-C Runtime(1)- SelfSuper - Chun Tips专注iOS开发 刨根问底Objective-C Runtime(1)- SelfSuper前言关于Objective-C Runtime一篇好的文档 : Understanding the Objective-C Runtime译文地址为: http://blog.cocoabit.com/blog/2
    02-10
  • Objective-C利用协议实现回调函数
    实现一个显示文字为测试的视图,然后经过3秒钟测试文字变为回调函数文字。相应的截图如下: 实现的代码如下:定义协议:#import UIKit/UIKit.h @protocol NoteDelegate//回调函数-(void)messageCallBack:(NSString *)string;@end  调用协议:#import Founda
    02-10
  • Objective-c开发中混合使用ARC
    首选“Compile Sources”的位置:选中工程-TARGETS-相应的target然后选中右侧的“Build Phases”,向下就找到“Compile Sources”了。如何在未使用arc的工程中引入一个使用了arc特性的文件:对相应的文件添加:-fobjc-arc参数如何在arc工程中引用未使用arc的文件
    02-10
  • Objective C运行时(runtime)技术总结,好强大
    前言:         Objective C的runtime技术功能非常强大,能够在运行时获取并修改类的各种信息,包括获取方法列表、属性列表、变量列表,修改方法、属性,增加方法,属性等等,本文对相关的几个要点做了一个小结。目录:(1)使用class_replaceMethod/cla
    02-09
  • Programming With Objective-C---- Introductio
    a:link { color: rgba(88, 114, 210, 1); text-decoration: none }a:visited { color: rgba(88, 114, 210, 1); text-decoration: none }a:hover { color: rgba(173, 189, 248, 1); text-decoration: none }a:active { color: rgba(0, 0, 255, 1); text-decora
    02-09
点击排行