Category:类别(或者分类),是oc中的特有语法,它是表示一个指向分类结构体的指针.原则上只能增加方法,不能增加成员变量
Category
Category 是表示一个指向分类的结构体的指针,其定义如下:
typedef struct objc_category *Category;
struct objc_category {
char *category_name OBJC2_UNAVAILABLE; // 分类名
char *class_name OBJC2_UNAVAILABLE; // 分类所属的类名
struct objc_method_list *instance_methods OBJC2_UNAVAILABLE; // 实例方法列表
struct objc_method_list *class_methods OBJC2_UNAVAILABLE; // 类方法列表
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; // 分类所实现的协议列表
//其中可以看出没有属性列表,所以原则上不能增加属性,但由于OC语言的运行特性,可以利用runtime进行属性的增加
如给一个UIImageView类扩张方法和增加属性
.h文件如下
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIImageView (Image)
@property(nonatomic, copy)NSString *imageUrl;
- (void)changeBgColor;
@end
NS_ASSUME_NONNULL_END
.m文件如下
import "UIView+Image.h"
#import <objc/runtime.h>
static NSString *namekey = @"namekey"; //定义一个key值
@implementation UIImageView (Image)
- (void)setImageUrl:(NSString *)imageUrl
{
objc_setAssociatedObject(self, &namekey, imageUrl, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)imageUrl
{
return objc_getAssociatedObject(self, &namekey);
}
- (void)changeBgColor
{
self.backgroundColor = [UIColor purpleColor];
}
@end
使用
UIImageView *view = [UIImageView new];
view.bounds = CGRectMake(0, 0, 100, 100);
view.center = self.view.center;
[self.view addSubview:view];
[view changeBgColor];
view.imageUrl = @"https://dsfdfssdf.png";
NSLog(@"%@",view.imageUrl);
///输出结果https://dsfdfssdf.png.说明属性增加成功
网友评论