zoukankan      html  css  js  c++  java
  • IOS中扩展机制Category和associative

    在ios开发中,有时候会遇到以下的问题,需要在一个类中添加自己的一些属性和方法。一般的做法是重写一个类来继承它,但是有时候就只是需要添加一些简单的属性和方法,那么这样做就显得过于麻烦,其实在IOS中还有更简单的方法,那就是Category.

    用一个例子来简单介绍以下Category的用法。

    @interface UIImageView (CategoryName)

    只需要在interface中加上category的名称。

    添加自定义的方法(Category)

    我们来给UIImageView添加一个自定义的speak方法

    @interface UIImageView (image)
    
    - (void)speak:(NSString *)words;
    
    @end
    
    

    接下来就是对这个方法的实现

    @implementation UIImageView (image)
    
    - (void)speak:(NSString *)words
    {
        NSLog(@"%@",words);
    }
    @end
    

    一旦实现了该方法,那么就可以在UIImageView中直接调用speak方法

    添加自定义的属性(associative)

    添加自定义属性需要用到associative

    @interface UIImageView (title)
    
    @property (nonatomic, strong) NSString *title;
    
    @end
    

    但是仅仅这样是没有办法使用的,还需要导入包#import <objc/runtime.h>
    用到了oc的运行时

    @implementation UIImageView (title)
    
    static void * MyKey = (void *)@"MyKey";
    
    - (NSString *)title
    {
        return objc_getAssociatedObject(self, MyKey);
    }
    
    - (void) setTitle:(NSString *)title
    {
        objc_setAssociatedObject(self, MyKey, title, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    
    @end
    

    然后实现该属性的get和set方法

    Category的局限性

    主要有两方面局限性:

    (1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。可以通过associative来解决

    (2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。这个类似于方法的重载,但是这里是直接覆盖了原方法

    类别的作用

    类别主要有3个作用:

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

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

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

    associative

    associative是在运行时动态的添加属性,一般用的比较少。但是还是需要熟悉一下。

  • 相关阅读:
    Idea中提交SVN或git时,忽略某些文件不提交
    SVN(subversion )服务端和客户端的下载安装使用
    layui官方文档
    使用IntelliJ IDEA配置Tomcat
    IntelliJ IDEA 配置JDK
    设置 IntelliJ IDEA 主题
    mybatis+mysql批量插入和批量更新
    session.资料
    MyEclipse2014.Maven自动更新
    Office.资料
  • 原文地址:https://www.cnblogs.com/mrchenhao/p/4212126.html
Copyright © 2011-2022 走看看