iOS分类与继承

177 阅读2分钟

分类

分类是oc语言特有的语法,它是一个表示指向分类的结构体的指针,原则上他只能增加方法不能增加属性.这个结构体里面只有方法列表,没有属性列表.

  • 通过property 为分类添加属性
.h文件
@interface UIView (add)
/**
 *
 */
@property (nonatomic, assign) CGFloat sx_height;
@property (nonatomic, assign) CGFloat sx_width;

@end
.m文件
#import "UIView+add.h"

@implementation UIView (add)
- (CGFloat)sx_height{
    return self.frame.size.height;
}
- (void)setSx_height:(CGFloat)sx_height{
    CGRect tempR = self.frame;
    tempR.size.height = sx_height;
    self.frame = tempR;
}
- (CGFloat)sx_width{
    return self.frame.size.width;
}
- (void)setSx_width:(CGFloat)sx_width{
    CGRect tempR = self.frame;
    tempR.size.width = sx_width;
    self.frame = tempR;
}
@end

//:或者
-(NSString *)height{
    return  objc_getAssociatedObject(self, @"height");
}
-(void)setHeight:(NSString *)height{
    objc_setAssociatedObject(self, @"height", height, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

这样就可以通过点语法来取得当前属性,如果单纯的使用runtime来添加属性外部是不能访问的.

注意:

1.分类原则上是不能添加属性,但是可以通过其他方法添加属性,但是不会生成成员变量.添加属性方法:一,runtime 关联 二,通过property 但是要手动实现setter和getter方法.

2.分类主要的功能就是给原有类增加方法,包括类方法和实例方法.例如给UIImageView增加网络图片分类.

3.重写主类的方法.重写会覆盖主类的方法,导致主类的方法不被执行.当一个主类有多个分类重写同一个方法时,只会执行其中一个,那就最后被添加的那个,至于那个是最后添加的,这个顺序在 build Phase -> complie Source 里面的分类顺序决定. 当我们在分类重写了主类的方法时,但又需要执行主类的方法,可以通过runtime 获取当前的类的方法列表,取方法列表最后一个就是主类的方法,然后手动调用就可以了.

继承

特点:

  • 子类可以直接复用父类的成员

  • 子类继承父类所有的方法声明以及实现,非私有的实例变量以及协议

  • 继承具有单根性和传递性,oc不支持多继承.

  • 子类可以拥有自己的属性和方法列表.

  • 继承可以很好地处理代码公共部分,来交给父类来处理.

所以当我们处理某一个方法时决定用分类还是继承的时候,要根据实际情况,来选择.