Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5399878
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: C/C++

2011-03-24 12:09:21

类别是Objective-C中最有用的一个特性类别允许你为一个已存在的类
添加一些方法而不用子类化该类,也不需要你了解该类的实现细节。

这是特别有用的,因为你可以给一个内建的对象添加方法。当你想在你的应用程序
里面给所有NSString类型的实例添加一个方法,你只需要添加一个类目,而不需要通
过定义一个子类来添加该方法。

比如,我想给NSString添加一个方法以判断它是不是一个URL,写法就像这样:

声明部分:

#import <Cocoa/Cocoa.h>
@interface NSString (Utilities)
- (BOOL) isURL;
@end


这很像一个类的声明。不同的地方在于后面没有列出父类,并且在括号里面写了类
目的名称。类目的名字可以随便取,但是最好能表达出你在类目中包含的方法所要做的

事。


下面是一个实现。切记,这不是很好的检查URL的方法。我们只是为了说清楚类目
的概念。

#import "NSString-Utilities.h"
@implementation NSString (Utilities)
- (BOOL) isURL
{
if ( [self hasPrefix:@"http://"] )
return YES;
else
return NO;
}
@end


现在,你可以使用NSString的这个方法了,下面的代码会在控制台打印“string1

is a URL”:
NSString* string1 = @"";
NSString* string2 = @"Pixar";
if ( [string1 isURL] )
NSLog (@"string1 is a URL");
if ( [string2 isURL] )
NSLog (@"string2 is a URL");




与子类不同,你不能通过类目来添加实例变量。但是你能通过类目重写(override)
类中已经存在的方法,当然,重写的时候要特别小心。
记住,
当你通过类目更改一个类的时候,这个更改会影响你这个应用程序中所有这
个类的实例。



阅读(1192) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~