zoukankan      html  css  js  c++  java
  • iOS学习笔记06—Category和Extension

    iOS学习笔记06—Category和Extension

     

    一、概述

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

    利用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不可以。

     
     
  • 相关阅读:
    仿当当网鼠标经过图片翻转
    静态随鼠标移动的Tip
    Weblogic免项目名
    weblogic中文乱码问题
    IE6下的{clear:both}出现怪异的空白
    动态随鼠标移动的Tip
    base标签在ie6下的恶心问题
    javascript中for和for in 区别
    jQuery性能优化<<转>>
    Ant项目打包脚本
  • 原文地址:https://www.cnblogs.com/lihaibo-Leao/p/5522954.html
Copyright © 2011-2022 走看看