iOS学习笔记之Category

写在前面

Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法。使用类别可以对框架提供的类(无法获取源码,不能直接修改)进行扩展
Category的作用有以下几点:

  • 将同一个类的实现分散到不同的文件或不同的框架中,方便代码的管理。

  • 创建对私有方法的前向引用,当其他类中的方法没有实现时,访问其他类的私有方法时编译器会报错,这是使用类别,在类别中声明这些方法,编译器就不会报错

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

使用列别案例

创建一个新项目,类型为基于Foundation的Command Line Tool,名称为VowelCounter。
创建一个新文件夹,类型为category,将其命名为VowelCounting,对应的类为NSString

在NSString+VowelCounting.h中为类别声明一个方法,该方法会被加入NSString类,代码如下:

#import <Foundation/Foundation.h>

@interface NSString (VowelCounting)

- (int)vowelCount;

@end

在NSString+VowelCounting.m中实现相应的方法,代码如下

#import "NSString+VowelCounting.h"

@implementation NSString (VowelCounting)

//统计有多少个原音字母
- (int)vowelCount
{
NSCharacterSet *charSet =
[NSCharacterSet characterSetWithCharactersInString:@"aeiouAEIOU"]; NSUInteger count = [self length];
int sum = 0;
for (int i = 0; i < count; i++) {
unichar c = [self characterAtIndex:i];
if ([charSet characterIsMember:c]) {
sum++;
}
}
return sum;
} @end

在main.m中使用新创建的NSString方法,代码如下:

#import <Foundation/Foundation.h>
**#import "NSString+VowelCounting.h"** int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSString *string = @"This is a test for categroy!";
NSLog(@"%@ has %d vowels", string, [string vowelCount]);
}
return 0;
}

运行结果如下:

通过类别,我们向NSString类添加了一个新的方法vowelCount,并且能在后续的代码中使用vowelCount,只需要将vowelCount所在的头文件包含到相应的项目中即可,无需定义子类就可以扩展类的功能。

总结

尽管类别有很多有点,可以避免不必要的继承,但它同样存在一定的局限性

  • category无法为类添加新的实例变量

  • 可能会出现名称冲突,如果类别和现有的方法重名,类别具有更高的优先级,这使得与新添加方法重名的那个方法永远也不会被调用。当然,也可以利用这点来覆盖就的方法。

iOS学习笔记之Category的更多相关文章

  1. iOS学习笔记06—Category和Extension

    iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inher ...

  2. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

  3. iOS学习笔记-自己动手写RESideMenu

    代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...

  4. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  5. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  6. IOS学习笔记之关键词@dynamic

    IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...

  7. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  8. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

  9. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

随机推荐

  1. 273. Integer to English Words

    题目: Convert a non-negative integer to its english words representation. Given input is guaranteed to ...

  2. AdventureWorksDW2008R2 attach: Unable to open the physical file. Operating system error 5: "5(Access is denied.)

    http://stackoverflow.com/questions/26014133/adventureworksdw2008r2-attach-unable-to-open-the-physica ...

  3. 关于Struts2的Validator的配置找不到DTD

    看教材的时候写的DTD是 <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN&q ...

  4. 将web项目deploy到tomcat的方法

    如果已经把整个项目发布到tomcat的webapps文件夹下,就不用再配置tomcat的server.xml了(也就是不用配置<Context>节点) 并且,你的项目的WEB-INF/li ...

  5. Mybatis Interceptor 拦截器原理 源码分析

    Mybatis采用责任链模式,通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变Mybatis的默认行为(诸如SQL重写之类的),由于插件会深入到Mybatis的核心,因此在编写自己的插件前最 ...

  6. Git查看、删除、重命名远程分支和tag【转】

    转自:http://zengrong.net/post/1746.htm 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也 ...

  7. Android提供了5种方式存储数据:

    --使用SharedPreferences存储数据: --文件存储数据: --SQLite数据库存储数据: --使用ContentProvider存储数据: --网络存储数据: 一:使用SharedP ...

  8. JSP 中的几种注释

    1.多行注释 <!-- 注释1 注释2 注释3 --> 或者 <!-- 注释1 …… 注释n //--> 2.多行注释,不同的是:注释内容不会发送到客户端,会被JSP引擎所忽略 ...

  9. [HIHO1260]String Problem I(trie树)

    题目链接:http://hihocoder.com/problemset/problem/1260 n个字符串,m次询问.每次询问给一个字符串,问这个字符串仅可以在一个地方加一个字母.这样操作后与n个 ...

  10. 浅谈 Scala 中下划线的用途

    Scala 作为一门函数式编程语言,对习惯了指令式编程语言的同学来说,会不大习惯,这里除了思维方式之外,还有语法层面的,比如 underscore(下划线)就会出现在多种场合,令初学者相当疑惑,今天就 ...