zoukankan      html  css  js  c++  java
  • Category和Extension

    转: http://blog.csdn.net/leikezhu1981/article/details/19091049

    一、概述

    类别是一种为现有的类添加新方法的方式。

    利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类)。

     

    二、示例

    1、声明类别

    @interface NSString (CategoryDemo)

    -(NSNumber*) lengthAsNumber;

    @end

     

    2、实现类别

    @implementation NSString (CategoryDemo)

    -(NSNumber*) lengthAsNumber{

       

        NSUInteger length = [self length];

        return ([NSNumbernumberWithUnsignedInt: length]);

    }

    @end

     

    3、调用:

    NSMutableDictionary *dic =[NSMutableDictionarydictionary];

    [dicsetObject: [@"Hello"lengthAsNumber]forKey:@"hello"];

    [dic setObject: [@"World!" lengthAsNumber] forKey: @"world"];

    NSLog(@"%@", dic);

     

    4、打印结果:

    2012-07-27 17:43:32.993CategoryDemo[2193:f803] {

        hello = 5;

        world = 6;

    }

     

    三、类别的局限性

    有两方面局限性:

    (1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。

    (2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。

     

    四、类别的作用

    类别主要有3个作用:

    (1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。

    (2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告

    (3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。

     

    四、扩展extension

    下面是extension和category的语法示例:

    // extension

    @interface MyObject(){

        int iextension;

    }

    -(void)testInExtension;// 类的mainimplementation不实现的话,有编译警告。

    @end

     

    // category

    @interface  MyObject(categoryDemo){

       

        //   int icategory;   // error: Ivarsmay not be placed in categories

    }

    -(void)testInCategory;// 不强制要求在类的mainimplementation中实现

    @end

     

    // implementation

    @implementation MyObject

    //

    //-(void)testInExtension{

    //

    //}

    //

    //-(void)testInCategory{

    //

    //}

    @end

    他们的主要区别是:

    1、形式上来看,extension是匿名的category。

    2、extension里声明的方法需要在mainimplementation中实现,category不强制要求。

    3、extension可以添加属性(变量),category不可以。

  • 相关阅读:
    LeetCode 24. Swap Nodes in Pairs (两两交换链表中的节点)
    LeetCode 1041. Robot Bounded In Circle (困于环中的机器人)
    LeetCode 1037. Valid Boomerang (有效的回旋镖)
    LeetCode 1108. Defanging an IP Address (IP 地址无效化)
    LeetCode 704. Binary Search (二分查找)
    LeetCode 744. Find Smallest Letter Greater Than Target (寻找比目标字母大的最小字母)
    LeetCode 852. Peak Index in a Mountain Array (山脉数组的峰顶索引)
    LeetCode 817. Linked List Components (链表组件)
    LeetCode 1019. Next Greater Node In Linked List (链表中的下一个更大节点)
    29. Divide Two Integers
  • 原文地址:https://www.cnblogs.com/ygm900/p/4589480.html
Copyright © 2011-2022 走看看