iOS类簇

作者: HarriesChen | 来源:发表于2015-02-02 14:05 被阅读391次

IOS 类簇

类簇(class cluster)是一种设计模式,在Foundation Framework中被广泛使用,举个简单的例子

NSArray *arr = [NSArray arrayWithObjects:@"foo",@"bar", nil]; 
NSLog(@"arr class:%@", [arr class]); 
// output: __NSArrayI 
显然__NSArrayI是一个私有类,来看看这个类的头文件

@interface __NSArrayI : NSArray { 
    unsigned int _used; 
} 

可以看出__NSArrayI继承了NSArray。为什么要这么设计呢?拿NSNumber来举个例子,我们都知道NSNumber可以存储多种类型的数字,如Int/Float/Double等等,一种方式是把NSNumber作为基类,然后分别去实现各自的子类,比如所float,int,double
初看起来也没什么问题,但如果子类很多,这对使用者来说显然不够方便,得记住这么多类。如果使用类簇,问题就变得简单了,把Number作为抽象基类,子类各自实现存取方式,然后在基类中定义多个初始化方式,像这样:

现在只需要记住一个类就可以了。NSNumber的初始化伪代码大概像这样:

- (id)initWithBool 
{ 
    return [[__NSCFBoolean alloc]init]; 
} 
 
- (id)initWithLong 
{ 
    return [[__NSCFNumber alloc]init]; 
} 

也可以想这样子

- (id)initWithType:(Type)type
{ 
    case:type
    {
         return [xxx new]; 
    }
    break;
   
   case:type
    {
         return [xxx new]; 
    }
    break;
} 
 

这样做的好处就是在基类中不必做过多的判断,公共的方法可以写在基类中,而不同的方法可以写在各自的类中,这样做可以使代码更加的清晰。

在iOS项目中的应用现在很多应用需要同时兼顾不同的系统版本,在表现上需要为不同的系统加载不同的图片资源,最简单粗暴的方法就是各种if/else判断,像这样:

if ([[UIDevice currentDevice]systemMajorVersion] < 7) 
{ 
    /* iOS 6 and previous versions */ 
} 
else 
{ 
    /* iOS 7 and above */ 
} 

不够优雅,可以使用类簇的思想来去掉if/else判断,把跟视图具体元素无关的代码放在基类,跟系统版本相关的代码拆成两个子类,然后在各自的类中加载相应的资源。

/* TestView.h */ 
@interface TestView: UIView 
 
/* Common method */ 
- ( void )test; 
 
@end 
 
/* TestView.m */ 
@implementation TestView 
 
+ (id)alloc 
{ 
    if ([self class]== [TestView class]) 
    { 
        if ([[UIDevice currentDevice] systemMajorVersion] < 7) 
        { 
            return [TestViewIOS6 alloc]; 
        } 
        else 
        { 
            return [TestViewIOS7 alloc]; 
        } 
    } 
    else 
    { 
        return [super alloc]; 
    } 
} 
 
- ( void )test 
{} 
 
@end

这里alloc时并没有返回TestView类,而是根据系统版本返回TestViewIOS6 或 TestViewIOS7。

/* TestViewIOS6.m */ 
@implementation TestViewIOS6: TestView 
 
- (void)drawRect: (CGRect)rect 
{ 
    /* Custom iOS6 drawing code */ 
} 
 
@end 
 
/* TestViewIOS7.m */ 
@implementation TestViewIOS7 
 
- (void)drawRect: (CGRect)rect 
{ 
    /* Custom iOS7 drawing code */ 
} 
 
@end 

相关文章

  • iOS类簇

    IOS 类簇 类簇(class cluster)是一种设计模式,在Foundation Framework中被广泛...

  • iOS 类簇

    iOS 类簇 Person.h Person.m TestCode 打印结果2021-07-14 14:19:16...

  • iOS 类族(类簇)

    什么是类族 "类族"是一种很有用的模式(pattern),可以隐藏"抽象基类"背后的实现细节.比如UIKit框架中...

  • iOS开发 - 类簇

    因此,直接alloc可能造成程序奔溃.比如比如 NSNotification *notif = [[NSNotif...

  • 类簇

    类簇在iOS中是一种非常实用的模式,例如:NSArray, NSDictionary等。 那么类簇有哪些特点了: ...

  • iOS 中的类簇

    类簇的定义 类簇(Class Cluster)是定义相同的接口并提供相同功能的一组类的集合,仅公开接口的抽象类也...

  • iOS 类簇(class cluster)

    概括 类簇是一种设计模式(抽象工厂模式),它管理了一组隐藏在公共接口下的私有类。 详解 简单来说,我们调用的是父类...

  • 【iOS】类簇(class cluster)

    类簇实际上是Foundation framework框架下的一种设计模式,它管理了一组隐藏在公共接口下的私有类。 ...

  • iOS 类簇(class clusters)

    类簇(class clusters) 类簇是Foundation framework框架下广泛使用的一种设计模式。...

  • 设计模式

    设计模式: 类簇 在iOS的Foundation框架中,类簇是一种常用的设计模式,将一些相近的,私有的,具体的子类...

网友评论

  • LD_左岸:请你设计一个方案,能够针对NSMutabledArray的容易crash的方法增加保护,如objectAtIndex、addObject等
    这道题考察的点有

    越界判断
    传参校验
    Class Clusters(类簇):直接针对NSMutabledArray做Method Swizzling是没用的
    Method Swizzling实战:具体实现、触发时机、方法交换时的校验等

    他这里面直接对可变数组做交换方法没用是因为可变数组继承自不可变数组吗

    我对不可变数组加交换方法的分类是不是就可以了呢

本文标题:iOS类簇

本文链接:https://www.haomeiwen.com/subject/vsakxttx.html