category 是Objective-C 里面最常用到的功能之一。category 可以为已经存在的类增加方法,而不需要增加一个子类。而且,我们可以在不知道某个类内部实现的情况下,为该类增加方法。如果我们想增加某个框架(framework)中的类的方法,category 就非常有效。比如,如果想在NSString 上增加一个方法来判断它是否是有效的 URL,那么就可以这样做:

@interface NSString (extension)
- (BOOL) isURL;
@end

是不是觉得与类的定义非常像,确实,就是category 没有父类,而且后面要跟括号里面写category 的名字,名字可以随便取。下面是刚刚 isURL 的实现:

@implementation NSString(extension)
- (BOOL) isURL{if( [self hasPrefix:@"http://"] )return YES;elsereturn NO;
}
@end

现在就可以在任何NSString类对象上调用这个方法了。下面是一个调用的例子:

NSString* str1 = @"http://www.blog.csdn.net/iukey";
NSString* str2 = @"刘伟Lewis";
if([str1 isURL])NSLog(@"str1 is a URL");
if([str2 isURL])NSLog(@"str2 is a URL");

通过上面的例子可以看出,通过类别所添加的新方法就成为类的一部分。我们通过为类别所添加的方法也存在于他的方法列表中,而为NSstring 子类添加的新方法,NSString是不具有的。通过类别所添加的新方法可以向这个类的其他方法一样完成任何操作。在运行时,新添加的方法和已经存在的方法在使用上没有任何区别。通过类别添加的方法和别的方法一样会被他的子类所继承。

类别接口的的定义看起来很像类接口的定义,而不同的是类别名用圆括号列出,他们位于类名后面。类别必须导入他所扩展的类的接口文件。标准语发格式如下:

#import "类名.h"
@interface 类名(类别名)
//新方法的声明
@end

和类一样类别的实现文件也要导入它的接口文件。一个常用的命名约定是,类别的基本文件名是这个类别扩展的类的名字后面跟类别名。因此一个名字为 “类名”+“类别名”+“.m”的实现文件看起来就是这样:

#import "类名类别名.h"
@interface 类名(类别名)
//新的实现方法
@end

注意:类别并不能为类声明新的实例变量,他只包含方法。然而在类作用域内所有实例变量,都能被这些类别访问。他们包括为类声明的所有的实例变量,甚至那些被@private 修饰的变量。可以为一个类添加多个类别,但每个类别名必须不同,而且每个类别都必须声明并实现一套不同的方法。

要记住,我们通过 category 来修改一个类的时候,他对应应用程序里这个类所有对象都起作用。跟子类不一样,category 不能增加成员变量。我们还可以用 category里重写类原先存在的方法(但是并不推荐这么做)。最后给出一个完整在例子(这个例子是扩展UIImage类 为其添加一个把图像变为灰度图像的方法):

//  GrayScale.h
//  XOGameFrame
//
//  Created by song on 11-1-12.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//#import <Foundation/Foundation.h>@interface UIImage (grayscale)- (UIImage *)convertToGrayscale ;@end
//
//  GrayScale.m
//  XOGameFrame
//
//  Created by song on 11-1-12.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//#import "GrayScale.h"@implementation UIImage (grayscale)typedef enum {ALPHA = 0,BLUE = 1,GREEN = 2,RED = 3
} PIXELS;- (UIImage *)convertToGrayscale {CGSize size = [self size];int width = size.width;int height = size.height;// the pixels will be painted to this arrayuint32_t *pixels = (uint32_t *) malloc(width * height * sizeof(uint32_t));// clear the pixels so any transparency is preservedmemset(pixels, 0, width * height * sizeof(uint32_t));CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();// create a context with RGBA pixelsCGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);// paint the bitmap to our context which will fill in the pixels arrayCGContextDrawImage(context, CGRectMake(0, 0, width, height), [self CGImage]);for(int y = 0; y < height; y++) {for(int x = 0; x < width; x++) {uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x];// convert to grayscale using recommended method: http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscaleuint32_t gray = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE];// set the pixels to grayrgbaPixel[RED] = gray;rgbaPixel[GREEN] = gray;rgbaPixel[BLUE] = gray;}}// create a new CGImageRef from our context with the modified pixelsCGImageRef image = CGBitmapContextCreateImage(context);// we're done with the context, color space, and pixelsCGContextRelease(context);CGColorSpaceRelease(colorSpace);free(pixels);// make a new UIImage to returnUIImage *resultUIImage = [UIImage imageWithCGImage:image];// we're done with image now tooCGImageRelease(image);return resultUIImage;
}@end

Category 类别 -Objective-C相关推荐

  1. objective-c中Category类别(扩展类)专题总结

    objective-c中Category类别(扩展类)专题总结 objective-c中Category 类别.扩展 专题总结 http://blog.csdn.net/jiajiayouba/art ...

  2. 12月25号 Category类别

    Category类别 1.在已有类的基础上进行扩展,无需像继承一样子类化,就可以直接添加一些方法 2.继承不仅可以添加方法还可以添加属性,类别只能添加方法 3.类别不会改变现有类的方法,万一重写,自己 ...

  3. Category类别、继承

    一.概念 1.category 类别 向某一个类中添加一些方法,不能添加属性 在哪里使用这个类别,就在哪里导入这个头文件 一个地方声明,多个地方实现 需要向某一个类里面添加一些方法 1.这个类是自己创 ...

  4. ios category类别的使用

    ios category类别的使用 ios category类别的使用 Objective-C提供了一个非常灵活的类(Class)扩展机制-类别(Category).类别用于对一个已经存在的类添加方法 ...

  5. Category(类别)和扩展(Extension)的区别

    类别: 1.类别不能为已存在的类添加实例变量. 2.类别中添加的方法优先级高,会覆盖原类中的方法 3.原类中的私有方法,可以在类别中定义一下,这样就可以使用了. 4.在categroy中定义的方法可以 ...

  6. 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射

    一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...

  7. 刨根问底Objective-C Runtime

    该笔记分为四篇: 刨根问底Objective-C Runtime(1)- Self & Super 刨根问底Objective-C Runtime(2)- Object & Class ...

  8. 刨根问底Objective-C Runtime(1)- Self Super

    转:http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime(1)%5Bnil%5D-self-and-s ...

  9. 基于SQL Server策略的管理–类别和数据库订阅

    SQL Server Policy Based Management provides several additional features which makes administering SQ ...

最新文章

  1. 网友:Java岗,自学一个月跳槽计算机视觉,其实入门很简单
  2. 十进制转换成十六进制c语言 链栈,C语言 链栈 实现十进制转换二进制,八进制,十六进制...
  3. 细说Redis分布式锁
  4. php is_null、empty、isset的区别
  5. 动态ram依靠什么存储信息_ROM、RAM、DRAM、SRAM和FLASH傻傻分不清
  6. matlab连通域分割_MATLAB车牌识别之7个字符切割浅谈【抽丝剥茧】
  7. mouseover与mouseenter、 mouseout与mouseleave的区别
  8. STM32库中自定义的数据类型
  9. 一阶惯性环节如何实现跟踪性能与滤波性能共存(总)
  10. 2020年中国高精度卫星导航定位行业现状、竞争格局及发展前景分析,基于北斗系统全面建成,定位技术向多场景发展「图」
  11. 计算机操作系统-6-并发程序设计
  12. 北京/西安内推 | 中国移动研究院NLP组招收自然语言处理算法实习生
  13. oracle11g oem使用手册,Oracle11g从入门到精通pdf
  14. 斐讯K2 E1 刷老毛子Padavan中继图文教程(与主路由同网段)
  15. 大学计算机课程制作生日卡片,计算机《制作生日贺卡》教学设计.doc
  16. 用STM32和ULN2003控制28BYJ-48步进电机正反转固定角度
  17. Android攻城狮datePicketimePicker
  18. 广东前海秋叶原集团:各种工程线 AV HDMI
  19. 【GITEE】解决 Push rejected
  20. 对立统一(哲学与分析学)

热门文章

  1. SQL操作全集[自己收藏]|Findnet.com.cn
  2. 且让我用花香润笔,用暖阳做墨
  3. 英语----我们快乐生活的一部分
  4. 2022年全球与中国磁簧开关市场现状及未来发展趋势
  5. Ubuntu 安装搜狗中文输入法
  6. 集体户口和个人户口的区别,看完你就明白了
  7. 我的有趣的英语学习经历
  8. 华东理工《文献检索》MOOC (4)---精通专利文献检索
  9. IBM大连工作室成立 Design thinking实现快速创新
  10. 阿里妹子,17分钟,机智化解一场重大宕机故障!