Objective-C分类 (category)和扩展(Extension)
2015-07-03 14:54
561 查看
1、分类(category)
使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以做到,这点和javascript中使用原型来定义属性有点类似。我们可以为一个类创建一个新的方法,而不需要在代码中编辑类定义。
下面就是定义并使用分类的例子程序,通过下面代码,我们可以给Object-C中的NSString 添加camelCaseString分类,使用camelCaseString方法,就可以去掉一个字符串中的空格,并将原有空格后的单词改写成大写(即将字符串转化为驼峰式)。
[cpp]
view plaincopyprint?
#import <Foundation/Foundation.h>
/*
定义分类的过程大致可分为以下几个步骤:
第一步、创建一个带有接口的新文件,即创建已有类
第二步、在新文件中添加需要扩展的方法及方法的实现,即需要添加的分类
*/
//NSString 表示将要添加分类的类名称,该类必须是已存在的。
//CamelCase 是为类添加的方法名称。
//只能添加方法,不能添加变量。
//头文件命名惯例:ClassName+CategoryName.h
@interface NSString (CamelCase)
-(NSString*) camelCaseString;
@end
@implementation NSString (CamelCase)
-(NSString*) camelCaseString
{
//调用NSString的内部方法获取驼峰字符串。
//self指向被添加分类的类。
NSString *castr = [self capitalizedString];
//创建数组来过滤掉空格, 通过分隔符对字符进行组合。
NSArray *array = [castr componentsSeparatedByCharactersInSet:
[NSCharacterSet whitespaceCharacterSet]];
//把数组的字符输出
NSString *output = @"";
for(NSString *word in array)
{
output = [output stringByAppendingString:word];
}
return output;
}
@end
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *str = @"My name is bill.";
NSLog(@"%@", str);
str = [str camelCaseString];
NSLog(@"%@", str);
[pool drain];
return 0;
}
#import <Foundation/Foundation.h> /* 定义分类的过程大致可分为以下几个步骤: 第一步、创建一个带有接口的新文件,即创建已有类 第二步、在新文件中添加需要扩展的方法及方法的实现,即需要添加的分类 */ //NSString 表示将要添加分类的类名称,该类必须是已存在的。 //CamelCase 是为类添加的方法名称。 //只能添加方法,不能添加变量。 //头文件命名惯例:ClassName+CategoryName.h @interface NSString (CamelCase) -(NSString*) camelCaseString; @end @implementation NSString (CamelCase) -(NSString*) camelCaseString { //调用NSString的内部方法获取驼峰字符串。 //self指向被添加分类的类。 NSString *castr = [self capitalizedString]; //创建数组来过滤掉空格, 通过分隔符对字符进行组合。 NSArray *array = [castr componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]; //把数组的字符输出 NSString *output = @""; for(NSString *word in array) { output = [output stringByAppendingString:word]; } return output; } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *str = @"My name is bill."; NSLog(@"%@", str); str = [str camelCaseString]; NSLog(@"%@", str); [pool drain]; return 0; }
2、扩展(Extension)
关于扩展,你可以这样理解:扩展是一种匿名分类;但是和匿名分类不一样的是,扩展可以添加新的实例变量(是不是觉得扩展已经强大到非一般的地步了? ^_^)从Xcode 4 之后就推荐在自定义类的.m文件中使用扩展,这样就能保证良好的代码封装性,避免把私有接口暴露给外面。
下面是一个扩展的例子:
[plain]
view plaincopyprint?
@interface MyClass : NSObject - (float)value; @end @interface MyClass () { //注意此处:扩展 float value; } - (void)setValue:(float)newValue; @end @implementation MyClass - (float)value { return value; } - (void)setValue:(float)newValue { value = newValue; } @end
@interface MyClass : NSObject - (float)value; @end @interface MyClass () { //注意此处:扩展 float value; } - (void)setValue:(float)newValue; @end @implementation MyClass - (float)value { return value; } - (void)setValue:(float)newValue { value = newValue; } @end
相关文章推荐
- Objective-C(九、Foundation框架和NSObject类)——iOS开发基础
- objective-c 中new与alloc/init的区别
- swift对比object-c
- 'dict' object has no attribute 'resolve'
- Objective-C 之 NSNotificationCenter vs delegate vs KVO
- Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释
- 【Effective Objective-C 2.0读书笔记】第四章:协议和分类
- Jackson框架提供的JsonGenerator ObjectMapper以及JSONObject 、JSONArray学习
- Objective C中数组排序几种情况的总结
- object-c 入门基础篇
- SSH Object类型转换
- objective-c中property 的属性strong,weak, retain, copy
- QObject对象 不指定父窗口的方法
- Java基础--多态、Object类、内部类、异常
- serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法
- 解决ACM异常wt.fc.ObjectNoLongerExistsException
- iOS开发之Objective C编程中的类别
- object-c底层(类和对象,runtime)
- JSONObject
- Objective-C 高性能的循环