博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS - OC Category 分类
阅读量:6526 次
发布时间:2019-06-24

本文共 2620 字,大约阅读时间需要 8 分钟。

1、Category

  • 1)分类/类别(category):

    • 允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量)。用以扩展自己或他人以前实现的类,使它适合自己的需要。

    • 分类的名称括在类名之后的一对圆括号 "( )" 中。

      @interface QCStudent (Print)    @end    @implementation QCStudent (Print)    @end
    • 分类文件名使用符号“+”来分隔类和分类的名字(Xcode 会自动生成)。

      QCStudent+Print.m    QCStudent+Print.h
    • 分类用它可以将类的定义模块化到相关方法的组或分类中。它还提供了扩展现有类定义的简便方式,并且不必访问类的源代码,也无需创建子类。

    • 分类可以覆写该类中的另一个方法,但是通常认为这种做法是拙劣的设计习惯。一个类可以拥有多个分类。使用分类添加新方法来扩展类不仅会影响这个类,同时也会影响它的所有子类。分类为现有类添加新方法可能对你有用,但它们可能和该类的原始设计或意图不一致。对象/分类命名对必须是唯一的。

  • 2)分类中添加属性(实例变量):

    • iOS 开发中,分类默认不允许添加属性。

    • 但是如果在自己开发的框架中,希望在分类中动态添加属性,可以通过 OC 运行时的关联对象功能添加。在分类中,定义一个属性时,需要自己实现 getter & setter 方法,而且没有 _成员变量

    • 运行时非常重要的一个应用:给分类动态添加属性,结果能够让框架包装的更好,让使用者做出最小的修改。

2、向分类中添加方法

// NSString+Path.h        @interface NSString (Path)                // 声明方法        - (NSString *)appendDocumentPath;                    @end    // NSString+Path.m            @implementation NSString (Path)                    // 实现方法        - (NSString *)appendDocumentPath {                        NSString *dir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;            return [dir stringByAppendingPathComponent:self.lastPathComponent];        }                    @end    // ViewController.m        // 调用自定义方法        NSString *documentPath = [@"hello.png" appendDocumentPath];

3、向分类中添加属性

// NSString+Path.h        @interface NSString (Path)                    // 声明属性        @property (nonatomic, retain) NSURL *url;                @end    // NSString+Path.m        // 包含运行时头文件        #import 
@implementation NSString (Path) /** void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) id objc_getAssociatedObject(id object, const void *key) 参数: object :属性的持有者 key :属性的键值 value :属性的数值 policy :属性的引用类型 */ // 设置属性的键值 const void *UrlKey = @"UrlKey"; // 属性的 setter 方法 - (void)setUrl:(NSURL *)url { // 用运行时方法设置属性的值 objc_setAssociatedObject(self, UrlKey, url, OBJC_ASSOCIATION_RETAIN); } // 属性的 getter 方法 - (NSURL *)url { // 用运行时方法获取属性的值 return objc_getAssociatedObject(self, UrlKey); } @end // ViewController.m NSString *myStr = [[NSString alloc] init]; // 设置自定义变量的值 myStr.url = [NSURL URLWithString:@"http://123.com"]; // 获取自定义变量的值 NSURL *strUrl = myStr.url;

转载地址:http://cgnbo.baihongyu.com/

你可能感兴趣的文章
江西打造千亿级移动物联网产业
查看>>
开始云私有云存储系统:让数据更安全高效
查看>>
Qt for S60 安装
查看>>
美国往事 - 追忆我的房东Dick 最终篇 - 伤感的结局
查看>>
【网络资料整理】-【redis】面试题目
查看>>
vue--角色管理
查看>>
Python 中的设计模式详解之:策略模式
查看>>
webpack+vue+typescript项目配置
查看>>
java源码学习-Spliterator
查看>>
jQuery这一篇就足够了
查看>>
女朋友也能看懂的Zookeeper分布式锁原理
查看>>
Spring Cloud Template极简的分布式微服务项目
查看>>
手把手带你做项目,3周学会小程序
查看>>
前端开发者应该明白的浏览器工作原理
查看>>
杭州ZoomVideo iOS面试题
查看>>
React Native ScrollView组件实现上拉下滑背景色不同
查看>>
深入 Parcel--架构与流程篇
查看>>
VUE项目搭建流程
查看>>
JAVA程序员面试30问(附带答案)
查看>>
程序猿生存指南-24 加班狂魔
查看>>