1:分类和扩展的区别
<1>分类:声明的时候使用格式中括号必须要有分类名称,创建完成后有两个文件夹(Person+action.h Person+action.m文件)
@interface 类名 (分类名称)
/*
方法声明
*/
@end
@implementation 类名(分类名称)
/*
方法实现
*/
@end
扩展:声明的时候使用格式中括号没有东西,创建完成后只有Person_action方法
interface Person ()
/*
方法声明或者成员变量
*/
@end
<2>:分类只能扩充方法,不能扩展属性和成员变量;
如果分类中声明了一个属性,那么分类只会生成这个属性的set、get方法声明,也就是不会有实现,所以如果使用该属性,程序将会崩溃
扩展中声明的方法和成员变量是私有的,只有在扩展类中能调用,外部的类无法调用
例如:在分类中设置成员变量:
#import "Person.h"
@interface Person (action)
@property(copy,nonatomic)NSString *testCategory;
@end
在类别中设置成员变量:
#import "Person.h"
@interface Person ()//注意括号中没有类名称,这是与分类category的不同之处
//为Person类添加成员变量
@property(copy,nonatomic)NSString *testExtension;
@end
在Person类中初始化方法中给两个成员变量赋值,运行,显示程序崩溃:
从程序崩溃的原因可以知道分类是不能声明成员变量,设置属性的;
2:分类和继承的区别
<1>分类增加的这些方法会成为类类型的一部分;
继承增加的方法不会成为父类的一部分
<2>分类增加的方法如果与类的方法同名,会覆盖原类的方法,因为Category的优先级更高
继承中子类也会覆盖父类的方法