类别
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仍是只读的.
相关文章推荐
- 杰奇分类设置方法
- 主页木马的制作方法
- 解密网页加密的两个方法
- 定义标题的最好方法
- Ruby简明教程之方法(Method)介绍
- Ruby基础知识之方法、代码段
- C#虚方法的声明和使用实例教程
- C#获取文件夹及文件的大小与占用空间的方法
- Delphi控件ListView的属性及使用方法详解
- VB6实现连接Access数据库的ADODB代码实现方法
- MySQL重定位数据目录的方法
- PowerShell中Get-Date对象的常用属性和方法介绍
- 在Linux上运行C#的方法
- C#实现绘制面形图表的方法详解
- ruby 流程控制 方法
- CSS清除浮动常用方法小结
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- Oracle中插入特殊字符:&和'的解决方法汇总
- C#获取字符串后几位数的方法
- javascript下拉框不被选中大类的区别方法