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. 306. Additive Number

    题目: Additive number is a string whose digits can form additive sequence. A valid additive sequence s ...

  2. CentOS查看系统信息命令和方法

    收集整理的一些linux查看系统信息的命令和方法: 一.linux查看服务器系统信息的方法: 1.查看主机名/内核版本/CPU构架: # uname -n -r -p -o localhost.loc ...

  3. AngularJs-ui modal 封装 dialog

    常常在操作中和用户进行交互,及时反馈操作结果:用到alert 和confrim 功能 找到一个基于anguarjs-ui的modal,方便我们使用 angular-dialog-service 注意要 ...

  4. leetcode:Power of Two

    Given an integer, write a function to determine if it is a power of two. 分析:这道题让我们判断一个数是否为2的次方数(而且要求 ...

  5. Codis使用教程

    1. Codis集群的搭建与使用 http://www.cnblogs.com/xuanzhi201111/p/4425194.html https://github.com/CodisLabs/co ...

  6. Android App接入微信开放平台注意事项

    一.Android第三方应用接入微信开放平台的注意事项: 1. 到微信开放平台官网申请正式的AppID(需通过审核),要填写包名.app签名的md5值.至于如何获取app签名信息,官方提供签名包apk ...

  7. Jenkins+Maven+SVN搭建自动部署、自动测试环境

    .打开http://10.3.15.78:8080/jenkins/,第一次进入里面没有数据,我们需要创建job,我们这有2个项目,需要创建2个job.http://10.3.34.163:9890/ ...

  8. OC获取文件(夹)的代码行数

    /* 考察NSString NSArray NSFileManager */ #import <Foundation/Foundation.h> /* 计算单个文件的代码行数 path:文 ...

  9. jquery中html()/text()/val()区别

    html就是你可以添加<span></span><li></li>的标记text只能写文本如果写了上面的标记则会以文本形式输出,就是输出标签体的内容va ...

  10. (二)深入梯度下降(Gradient Descent)算法

    一直以来都以为自己对一些算法已经理解了,直到最近才发现,梯度下降都理解的不好. 1 问题的引出 对于上篇中讲到的线性回归,先化一个为一个特征θ1,θ0为偏置项,最后列出的误差函数如下图所示: 手动求解 ...