1. 扩展类的功能
Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,我们可以为任何已经存在的class添加方法(不包括数据成员)却不需要访问该class的实现文件。
新添加的方法和原有的方法具有同等的地位,可以访问class的数据成员,并且完全植入到class的继承体系之中,子类同样会继承新添加的方法。 利用category对类进行扩展可以避免使类的继承体系过于臃肿,复杂,降低了维护成本。另外,新添加的方法如果和已经存在的方法具有相同的 prototype,那么新添加的方法将会覆盖已经存在的方法,也就是category使得使得在没有源文件时修改已存在class的 functionality或者清除bug成为可能,所有该class的对象的行为都将发生变化,这一点是继承无法达到的。

可以在以下情况使用Category

当你在定义类的时候,在某些情况下(例如需求变更),你可能想要为其中的某个或几个类中添加方法。
一个类中包含了许多不同的方法需要实现,而这些方法需要不同团队的成员实现 (有点意思,不知实践中效果如何)
当你在使用基础类库中的类时,你可能希望这些类实现一些你需要的方法。

使用方法:“原类名+Category”的方式命名,例子如下:

(1)定义与实现
NSString+Background.h (给NaviationBar新添加的一个Category)
#import <UIKit/UIKit.h>
@interface UINavigationBar (Background)
- (void)setNavgationBarBg;
@end
 
NSString+Background.m
#import "UINavigationBar+Background.h"
@implementation UINavigationBar (Background)
 
- (void)setNavgationBarBg {
    UIImage * TitleBarImage = [UIImage imageNamed:@"Navigationbar_bg.png"];
    if([self respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {
        [self setBackgroundImage:TitleBarImage forBarMetrics:UIBarMetricsDefault];
    }
}
@end
 
(2)调用
#import NSString+Background.h

2. 模拟私有方法/函数
在.m中,实现私有方法。
Foo.m
#impot Foo.h
@interface Foo (private)
- (void) testPrivate;
@end

@implementation Foo
- (void) test {
     [self testPrivate];
}

- (void) testPrivate {
     NSLog(@"testPrivate Executed");
}
@end

3.缺点
Category可以访问原始类的实例变量,但不能添加变量,如果想添加变量,可以考虑通过继承创建子类。
Category可以重载原始类的方法,但不推荐这么做,这么做的后果是你再也不能访问原来的方法。如果确实要重载,正确的选择是创建子类
名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。

OC拓展(category)的更多相关文章

  1. OC分类(Category)

    Category 分类 ,又称为类别.类目 概念 Category有多种翻译:分类.类别.类目(一般叫分类的多) Category式OC特有的语法,其他语言没有的语法(类似于C#语言中的"扩 ...

  2. iOS中OC给Category加入属性

    引: 非常多人知道能够用Category给已有的类加入一些新方法,可是不同于swift中的extension,Objective-C中的Category(类别)是不支持直接加入属性的.那假设就是须要加 ...

  3. [OC笔记] Category分类之见解

    用过别的语言做过开发的同学都知道,如果你想扩充一个类,就应该去继承这个类.但是OC里面有更好的方法,那就是分类. 那什么是分类呢?就是在不改变原先类,我们可以在其中添加咱们自定义的方法,这样和同事合作 ...

  4. OC之category的用法

    简介 实例 好处 一.category简介 动态的为某个已经存在的类增加方法,不可以增加成员变量 二.实例 // // Student+CatetoryStudent.h // Category // ...

  5. iOS之Category关联属性

    Objective-C /** 原文件 */ // Person.h #import <Foundation/Foundation.h> @interface Person : NSObj ...

  6. 用Reveal分析第三方App的UI

    文章出自:听云博客 Reveal简介: 这是个神奇的工具,它能常透彻地分析个App的UI结构. 这个工具包括两部分,部分是在PC上运行的一个独立应用,即Reveal.app,另一部分代码在你要分析的某 ...

  7. 【原】iOS学习之Swift之语法2(精简版)

    1.可选类型和强制解包(?和!) 1> 可选类型(?)和强制解包(!) 在swift中,可选类型(?) 其根源是一个 枚举型,里面有 None 和 Some 两种类型.其实所谓的 nil 就是 ...

  8. Swift中UITableView的简单使用

    Swift中的注释 使用"// MARK:- 注释内容",对属性或方法进行注释 使用"///注释内容"对属性或方法提供调用说明的注释 使用extension对同 ...

  9. Swift开发语法

    Swift开发入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者 ...

随机推荐

  1. codeigniter db操作方法

    链接数据库 ——- $this->load->database();//手动连接数据库 //连接多数据库 $DB1 = $this->load->database(‘group ...

  2. git 基本命令

    (命令总结内容来自 博客园  圣骑士Wind的博客) git init      在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git ...

  3. ACM题目————马拦过河卒

    题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...

  4. windows tomcat配置大全

    Tomcat下JSP.Servlet和JavaBean环境的配置 第一步:下载j2sdk和tomcat:到sun官方站点()下载j2sdk,注意下载版本为Windows Offline Install ...

  5. Linux vim的安装和配置:

    1:首先就碰到一个问题 程序 'vim' 已包含在下列软件包中: * vim * vim-gnome * vim-tiny * vim-athena * vim-gtk * vim-nox 请尝试:s ...

  6. Animator根骨骼运动原始实现代码

    实测过确实可行,注意如果没有刚体组件,实现方式会不一样 public class TestSMB : StateMachineBehaviour { public override void OnSt ...

  7. 2016年11月3日 星期四 --出埃及记 Exodus 19:19

    2016年11月3日 星期四 --出埃及记 Exodus 19:19 and the sound of the trumpet grew louder and louder. Then Moses s ...

  8. python学习笔记三 函数(基础篇)

    函数 内置函数 常用的内建函数: type()  列出指定对象的类型 help()  能够提供详细的帮助信息 dir()    将对象的所有特性列出 vars()  列出当前模块的所有变量 file, ...

  9. 在C#中怎么调用带参数的存储过程啊??

    1)执行一个没有参数的存储过程的代码如下:SqlConnection conn=new SqlConnection(“connectionString”);SqlDataAdapter da = ne ...

  10. C# DataTable的详细用法

    在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...