iOS学习笔记之Category
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的更多相关文章
- iOS学习笔记06—Category和Extension
iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inher ...
- IOS学习笔记48--一些常见的IOS知识点+面试题
IOS学习笔记48--一些常见的IOS知识点+面试题 1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...
- iOS学习笔记-自己动手写RESideMenu
代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- IOS学习笔记之关键词@dynamic
IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记10-UIView动画
上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
随机推荐
- Java 虚拟机体系结构
众所周知,Java源代码被编译器编译成class文件.而并不是底层操作系统可以直接执行的二进制指令(比如Windows OS的.exe文件).因此,我们需要有一种平台可以解释class文件并运行它.而 ...
- PHP 对象和数组互相转换
最简单的:$array = (array)$object; 但是, 如果对象的属性也是个对象的话, 就转换不了了, 就是说PHP的强制类型转换不能把对象属性中的对象转换成数组的下一个维度的数组, 刚刚 ...
- flex 4 写皮肤
皮肤容器:s:SparkSkin 主机组件: [HostComponent("spark.components.Panel")] 绘制: <s:Group left=&qu ...
- js动态判断密码强度&&实用的 jQuery 代码片段
// 网上拷贝的代码,效果不太好需要自己调整<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- angularjs tips
angular-ui #1 .Impossible to disable fade in modal angularjs ui modal 去掉fade in效果: googleA googleB # ...
- Oracle —— 函数 length() 和 lengthb() 的区别
先看看几个例子: select length('Oracle') from dual 结果:6 select lengthb('Oracle') from dual 结果:6 select lengt ...
- 标准类型内建函数 cmp()介绍
内建函数cmp()用于比较两个对象obj1 和obj2, 如果obj1 小于obj2, 则返回一个负整数,如果obj1 大于obj2 则返回一个正整数, 如果obj1 等于obj2, 则返回0.它的行 ...
- BZOJ 1257 余数之和sum
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1257 题意:计算sigama(m%i)(1<=i<=n). 思路: 这样就简 ...
- Using Git subtrees to split a repository
https://lostechies.com/johnteague/2014/04/04/using-git-subtrees-to-split-a-repository/ We are in a p ...
- visual studio 中删除多余的空白行
替换 Ctrl+H 正则 勾选 替换 ^\s*\n 为空