category相关

category功能

  1. 将代码和逻辑分散到不同的页面
  2. 优雅的实现代码的复用
  3. 通过在category中生命原来类的私有方法,可以让外界调用原来类的私有方法
  4. 向对象添加非正式协议

将代码和逻辑分散到不同的页面、优雅的实现代码的复用

这个是我们使用类别的最简单,最常见的情形,不解释了。

通过在category中生命原来类的私有方法,可以让外界调用原来类的私有方法

A是一个类,A+B是一个A的category。A有一个私有方法func。可以在A+B的.h文件里生命func方法,.m里不用实现。那么import A+B的类,都可以调用A的func方法了。

向对象添加非正式协议

凡是NSObject或其子类的类别,都是非正式协议。因为所有的类都继承自NSObject,所以只要在任何类中引入NSObject+XXX,就可以调用这个类别中的方法了。

category增加属性

情形一:只是看上去增加了属性,其实没有增加

例如我们常用的View的category代码:
.h的代码如下:

@interface UIView (Size)

@property (nonatomic, assign) CGFloat left;

.m的代码如下:

- (CGFloat)left;
{
     return CGRectGetMinX([self frame]);
}

为什么说是看上去增加了属性呢,因为实际上根本没有增加任何属性,只不过增加了left的getter和setter方法。方法的实现也完全没有用到原来没有的属性。

情形二:实实在在的增加了属性

有时候我们就是要实现一个新的属性,那么可以通过运行时去实现
代码如下:

//NSObject+IndieBandName.h
@interface NSObject (IndieBandName)
@property (nonatomic, strong) NSString *indieBandName;
@end

// NSObject+IndieBandName.m 
#import "NSObject+Extension.h"
#import <objc/runtime.h>
static const void *IndieBandNameKey = &IndieBandNameKey; 
@implementation NSObject (IndieBandName)
@dynamic indieBandName;
- (NSString *)indieBandName { 
    return objc_getAssociatedObject(self, IndieBandNameKey);
}
- (void)setIndieBandName:(NSString *)indieBandName { 
    objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end

什么是extension

首先iOS里extension并不是继承(java使用extends关键字表示继承,OC并不是。。)

extension其实就是.m里的interface里定义的那些东西,可以重新对.h里的属性进行读写属性的更改,可以新定义方法,还可以增加属性等。

和category的区别:
*Category的小括号中有名字,而Extension没有;
*Category只能扩充方法,不能扩充成员变量和属性;
*extension定义的方法必须实现。

posted @ 2016-11-22 15:53  张驰小方块  阅读(200)  评论(0)    收藏  举报