一,分类
分类不可以添加属性,在编译阶段不会报错,但是在运行的时候会报错,崩溃,原因是找不到setter方法
如果想要给分类添加属性,应该使用runtime,例如为分类添加属性:
@property (nonatomic,copy) NSString *userId;
在.m文件中实现下面这两个方法
-(void)setUserId:(NSString *)userId
{
objc_setAssociatedObject(self, NULL, userId,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSString *)userId
{
return objc_getAssociatedObject(self, NULL);
}
分类也不可以添加实例变量,在编译阶段就会报错;
分类可以添加方法;
分类方法添加注意点:
1、分类中不能扩展原有类的成员变量
2、@property在分类中只能生成getter setter方法的声明,不能生成实现和成员变量
*分类可以扩充系统自带的类的功能*
给NSObject增加分类会影响到所有的类,但是这个东西一定要谨慎小心
3、你不能在分类中定义与原有类同名方法,不同的分类之间也不可以有同名的方法
4、如果你再分类中增加一个原有类同名方法 ,那么分类中个方法会覆盖原有类的方法(哪怕你没有导入这个分类)
5、多个分类中如果有相同方法,最后编译分类的方法
二,扩展是一种匿名分类,但是和匿名分类不一样的是,扩展可以添加新的实例变量和属性
从Xcode4之后就会推荐在自定义类的.m文件中使用扩展,这样就能保证良好的代码封装性,避免把私有接口暴露在外面.例如:
.h文件
@interface MyClass : NSObject
- (float)value;
@end
.h文件
@interface MyClass () { //注意此处:扩展
float value;
}
- (void)setValue:(float)newValue;
@end
@implementation MyClass
- (float)value {
return value;
}
- (void)setValue:(float)newValue {
value = newValue;
}
本文详细介绍了Objective-C中的分类和扩展的概念及其用法。分类可以为现有类添加新方法,但不能添加属性或实例变量;而扩展则可以在不公开内部细节的情况下添加新的实例变量和属性。
10万+

被折叠的 条评论
为什么被折叠?



