A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© luronghua 中级黑马   /  2016-7-19 22:33  /  1467 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1、分类(category)

使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以做到,这点和javascript中使用原型来定义属性有点类似。

我们可以为一个类创建一个新的方法,而不需要在代码中编辑类定义。

下面就是定义并使用分类的例子程序,通过下面代码,我们可以给Object-C中的NSString 添加camelCaseString分类,使用camelCaseString方法,就可以去掉一个字符串中的空格,并将原有空格后的单词改写成大写(即将字符串转化为驼峰式)。

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

#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:

                      [NSCharacterSetwhitespaceCharacterSet]];

     

   //把数组的字符输出

   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 plaincopy在CODE上查看代码片派生到我的代码片

@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  

2 个回复

倒序浏览
涨知识了
回复 使用道具 举报
好多啊,一眼望不到尽头
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马