OC分类和类扩展的使用
通常在类中使用@property声明属性,编译器会自动生成_成员变量和setter/getter。
分类(类别):原则上只能声明属性和添加方法,实际上属性的setter/getter可通过runtime关联对象实现。
原因:分类的指针结构体中,没有属性列表,所以使用@property无法生成_成员变量和setter/getter方法。
类扩展(匿名分类):可增加方法和成员变量,只是该实例变量默认是@private类型,且适用范围在自身类。
示例:用分类封装一个可展示在scrollview上的空态数据类,emptyView建议根据自身需求自定义
#import
typedefNS_ENUM(NSUInteger,emptyListType){
//无数据
emptydata,
//无网络
emptyNetWork,
};
@interface UIScrollView (Empty)
@property(nonatomic, strong) NSString *idx;
@property(nonatomic, strong) UIView *emptyView;
//scrollview上添加emptyView,展示不同网络请求状态对应不同的empty页面
-(void)showEmptyType:(emptyListType)type;
@end
#import "UIScrollView+Empty.h"
#import
staticconstNSString*idxkey = @"idxkey";
@implementation UIScrollView (Empty)
-(NSString *)idx{
return objc_getAssociatedObject(self,(__bridge const void * _Nonnull)(idxkey));
}
- (void)setIdx:(NSString*)idx{
objc_setAssociatedObject(self, (__bridge const void * _Nonnull)(idxkey), idx, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(UIView *)emptyView{
return objc_getAssociatedObject(self, @selector(emptyView));
}
-(void)setEmptyView:(UIView*)emptyView{
objc_setAssociatedObject(self,@selector(emptyView), emptyView,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
//可根据自己需求在emptyView上添加imageview和label等
- (void)addEmptyViewWithYspace:(CGFloat)yspace{
if(self.emptyView.superview) {
[self.emptyView removeFromSuperview];
}
self.emptyView = [[UIView alloc]initWithFrame:CGRectMake(0.5*(UIScreen.mainScreen.bounds.size.width-200), yspace, 200, [self.idx floatValue])];
self.emptyView.backgroundColor = UIColor.orangeColor;
}
-(void)showEmptyType:(emptyListType)type{
if(type ==emptydata) {
self.idx=@"170";
}else{
self.idx=@"200";
}
[self addEmptyViewWithYspace:0.5*(self.frame.size.height-[self.idx floatValue])];
self.emptyView.userInteractionEnabled = false;
NSLog(@"emptyview%@",self.emptyView);
[selfaddSubview:self.emptyView];
}
@end
展示效果如图1-1:
1-1类扩展:
@interface Persion()
@property(nonatomic, strong) NSString *test;
- (void)test;
@end
@implementation Persion
/*
写相应实现
*/
- (void)test{
}
@end