Objective C 类别(Category)与类扩展(Extensions)

来源:互联网 发布:naca230族翼型数据库 编辑:程序博客网 时间:2024/06/03 21:08

一.类别(Category)

         类别(Category)是一种可以为现有的类(包括类簇:NSString...,甚至源码无法获得的类)添加新方法的方式无需从现有的类继承子类。类别添加的新方法可以被子类继承。

         注:继承(inheritance)无法为一个类簇创建子类。类别不能添加实例变量。

1. 创建类别

1.1 声明类别

       类别的声明和类的声明格式相似:

       @interface ClassName(CategoryName)

            //method declarations

       @end//CategoryName


       头文件"NSString+Tools.h":

  #import <Cocoa/Cocoa.h>

  @interface NSString (Tools)

  - (NSNumber *) lengthAsNumber;

  @end//Tools

1.2 实现类别

        实现文件"NSString+Tools.m":

  #import "NSString+Tools.h"

  @implementation NSString(Tools)

  - (NSNumber *) lengthAsNumber

  {

   unsigned int length = [self length];

            return [NSNumber numberWithUnsignedInt: length];

  }

  @end//Tools


2. 类别的作用

      类别有以下5个主要作用:

      为现有的类添加新方法;

      ②将类的实现分散到多个不同文件或多个不同框架中(把一个大的类按功能划分成几块,便于维护);

      ③创建对私有方法的前向应用;

      ④使用category的非正式协议(informal protocol)来实现委托(delegation);

      ⑤通过替换现有类中的方法,修正现有类(没有源码文件的情况下)的功能或错误

        2.1 把类按功能划分成几块

                UIKIT_CLASS_AVAILABLE(2_0) @interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer> {

                 ................................

                 }

                 .................................

                @end//UIView                   

                @interface UIView(UIViewGeometry)

                   .................  

                @end//UIViewGeometry


                @interface UIView(UIViewHierarchy)

                   .................

                @end//UIViewHierarchy

       

                @interface UIView(UIViewRendering)

                    ................

                @end//UIViewRendering


                @interface UIView(UIViewAnimation)

                    ...............

                @end//UIViewAnimation


                @interface UIView(UIViewAnimationWithBlocks)

                     ........................

                @end//UIViewAnimationWithBlocks

        2.2 委托和类别

             委托是类别的一种应用:被发送给委托对象的方法可以声明为一个NSObject的类别。创建NSObject的类别称为“创建一个非正式协议”。非正式协议只是一种表达方式,它表示“这里有一些你可能希望实现的方法,当然你也可以不实现这些方法”。示例NSNetService委托方法的部分声明如下:

       @interface NSObject(NSNetServiceBrowserDelegateMethods)

       - (void)netServiceBrowserWillSearch: (NSNetServiceBrowser*) browser;

       - (void)netServiceBrowser: (NSNetServiceBrowser*) aNetServiceBrowser

                         didFindService: (NSNetService *) service

                            moreComing: (BOOL) moreComing;

       - (void)netServiceBrowserDidStopSearch: (NSNetServiceBrowser*) browser;       

       - (void)netServiceBrowser: (NSNetServiceBrowser*) aNetServiceBrowser

                         didRemoveService: (NSNetService *) service

                            moreComing: (BOOL) moreComing;

       @end//NSNetServiceBrowserDelegateMethods

       2.2.1 如何知道委托对象能否处理发送给它的消息(响应选择器

             NSNetServiceBrowser首先检查委托对象,通过NSObject类的respondsToSelector:的方法询问其能否响应该选择器。如果委托对象能响应,则NSNetServiceBrowser给委托对象发送消息,反正则不发。

             选择器只是一个方法的名称,它以Object-C运行时使用的特殊方式编码,以快速执行查询。使用@selector(方法名称)预编译指令指定选择器。示例:Car类的setEngine:方法的选择器是 @selector(setEngine:)

             Car类的setTire: atIndex:方法的选择器是  @selector(setTire: atIndex:)

             Car *car = [[Car alloc] init];

             if ([car respondsToSelector: @selector(setEngine:)])

             {

                     return YES;

             }


3. 类别的局限性

      ①无法向现有的类中添加新的实例变量(类别没有位置容纳实例变量);    

      ②方法名称冲突,即类别中的新方法的名称与现有类中方法名称重名,类别具有更高的优先级,类别中的方法将完全取代现有类中的方法(再也无法访问现有类中的同名方法)。


二.类扩展Class extensions

     类扩展声明格式@interface MyClass(), 可以在类扩展中声明属性和实例变量

@interface MyClass : NSObject

    ...................

@end


@interface MyClass()//类扩展

{

     float _value;

}

    @property(assign,readonly) value;

@end



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 硬盘用久了变慢怎么办 地税申报工资人员弄错怎么办 买保险保单丢了怎么办 买保险的银行卡丢了怎么办 没学过JAVA入职怎么办 磨砂皮擦了鞋油怎么办 磨破皮伤口有沙子怎么办 工行信用卡被风险锁定了怎么办 超重被超限站查住以后怎么办 银行卡输入密码次数超限怎么办 信用卡密码错误次数超限怎么办 农行密码错误次数超限怎么办 剪力墙偏心受拉怎么办 韵达快递寄丢了怎么办 重要快递送丢了怎么办 快递员送货丢了怎么办 买的快递丢失了怎么办 申通把件弄丢了怎么办 淘宝快递送丢了怎么办 我的快递丢了怎么办 顺丰快递丢件怎么办 韵达快递不发货怎么办 发物流丢了怎么办啊 圆通快递寄丢了怎么办 中通快递弄丢了怎么办 中通快递寄丢了怎么办 中通快递丢了怎么办 物流没保价坏了怎么办 顺丰保值快递丢了怎么办 顺丰保价件丢失怎么办 公司购买货物对方没有发票怎么办 加工货物对方不取怎么办 物流发货发错了怎么办 货车拉的货丢了怎么办 壹米滴答丢货怎么办 物流东西弄丢了怎么办 理赔款账号打错了怎么办 顺丰快递搞丢了怎么办 论文表格跨页了怎么办 网线突然没网了怎么办 室内门高门洞矮怎么办