您的位置:首页 > 其它

类别

2015-06-29 08:47 260 查看

类别

为现有的类(自定义的类、第三方的类或者是系统定义的类)添加一些新的行为

Objective-C的动态运行时的分配机制

为现有类添加新的行为,通常也可以采用创建子类的方法,但是它是有限制的,如现有的类你没有源代码,或者现有的类是以类簇的形式存在。都无法添加新的行为。

不能为现有类添加成员变量

类别的类的优先级都是极高的(没有系统定义的高)

声明和实现类别

类别代码习惯放在独立的文件中,通常会以”类名称+类别名称”的风格命名.这并不是硬性规定,而是一个好的习惯.如: NSString+NumberConvenience. 其含义是为现有类 NSString 添加一个名为 NumberConvenience 的类别

只要保证类别名唯一,可以像一个类中添加任意数量的类别.

XCode 提供有创建类别的模板

声明类别

@interface NSString (NSNumberConvience)

//为现有的类(NSString)添加一个新的方法
- (NSNumber*)lenthAsNumber;

@end


这个声明有两个特点:

(1)现有的类位于@interface关键字之后,然后是位于括号中的类别名称。

他表示:向NSString类中添加一个名称为NumberConvenience的类别

同名类别有唯一性,但是可以添加任意多的不同名类别

(2)可以执行希望向其添加类别的类以及类别的名称,还可以列出添加的方法

不可以添加新的实例变量,类别生命中没有实例变量部分

类别的实现

@implementation NSString (NSNumberConvience)

- (NSNumber*)lenthAsNumber
{
NSUInteger length = [self length];
return [NSNumber numberWithUnsignedLong:length];
}

@end


类别的优缺点

1.缺点

* 无法向类别中添加新的实例变量

* 名称冲突. 注意:类别具有较高的优先级

2.优点

* 可以将类的实现代码分散到多个不同的文件或框架中,方便一个大的工程的实现,有多个人来做属于他的那一部分

* 创建对私有方法的前向引用

*向对象添加非正式协议

类别的扩展

没有名字的类别

可以再源代码类类里使用

可以添加实例变量,作为类的私有变量

可以将只读权限改成可读写的权限

创建数量不限

下面举一个例子,新建一个类 Things 继承与超类 NSObject,头文件内容如下:

#import <Foundation/Foundation.h>

@interface Things : NSObject

@property (assign) NSUInteger thing1;
@property (assign,readonly) NSUInteger thing2;
//thing2是只读的

- (void)resetAllValues;
- (void)print;
@end


在类的实现文件中代码如下:

#import "Things.h"

//用没有名字的类别, 来实现类的扩展
@interface Things ()
{
NSUInteger thing4;
}

@property(assign) NSUInteger thing3;
@property (assign,readwrite) NSUInteger thing2;

@end

@implementation Things

- (void)resetAllValues
{

self.thing1 = 100;
//正是因为我们改变thing2属性, 让其成为为可读写的, 所以这里才可以给其赋值
self.thing2 = 200;
self.thing3 = 300;
thing4 = 400;

}

- (void)print
{
NSLog(@"%ld,%ld,%ld,%ld",self.thing1,self.thing2,self.thing3,thing4);
}
@end


在 main()中的代码如下:

#import <Foundation/Foundation.h>

#import "Things.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Things *th = [[Things alloc] init];
//        虽然类扩展里里将thing2改成读写属性, 但在外界面使用的时候, 还是主类的属性
//        th.thing2 = 200;
[th resetAllValues];
[th print];
}
return 0;
}


代码的结果为:100,200,300,400.

实现了对 readonly 的成员变量 thing2的值的改写,但是只能在其类别的实现文件中改写,在此外 thing2仍是只读的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息