分类(Category)是OC中的特有语法,它是表示一个指向分类的结构体的指针。原则上它只能增长方法,不能增长成员(实例)变量。bash
setter/getter
方法, 也不会生成实现以及私有的成员变量(编译时会报警告);分类 > 本类 > 父类
。所以在开发中尽可能不要覆盖原有类;_成员变量
和
setter/getter
,但分类的指针结构体中,根本没有属性列表。因此在分类中用@property声明属性,既没法生成
_成员变量
也没法生成
setter/getter
。
_成员变量
和
setter/getter
方法,报错就在所不免了。
setter/getter
方法,可不能够在手动添加
setter/getter
来避免崩溃,完成调用呢?
runtime
完成的,虽然系统不给咱们生成
setter/getter
,但咱们能够经过
runtime
手动添加
setter/getter
方法。
#import <objc/runtime.h>
static NSString *nameWithSetterGetterKey = @"nameWithSetterGetterKey"; //定义一个key值
@implementation Programmer (Category)
//运行时实现setter方法
- (void)setNameWithSetterGetter:(NSString *)nameWithSetterGetter {
objc_setAssociatedObject(self, &nameWithSetterGetterKey, nameWithSetterGetter, OBJC_ASSOCIATION_COPY);
}
//运行时实现getter方法
- (NSString *)nameWithSetterGetter {
return objc_getAssociatedObject(self, &nameWithSetterGetterKey);
}
@end复制代码
可是注意,以上代码仅仅是手动实现了setter/getter
方法,但调用_成员变量
依然报错。
ui
Extension是Category的一个特例。类扩展与分类相比只少了分类的名称,因此称之为“匿名分类”。
其实开发当中,咱们几乎每天在使用。对于有些人来讲像是最熟悉的陌生人。spa
@interface XXX ()
//私有属性
//私有方法(若是不实现,编译时会报警,Method definition for 'XXX' not found)
@end复制代码
为一个类添加额外的原来没有变量,方法和属性
通常的类扩展写到.m
文件中
通常的私有属性写到.m
文件中的类扩展中
指针
runtime
解决无setter/getter
的问题而已);