分类与扩展

来源:互联网 发布:上海婚纱摄影推荐知乎 编辑:程序博客网 时间:2024/06/07 06:01

一,分类

分类不可以添加属性,在编译阶段不会报错,但是在运行的时候会报错,崩溃,原因是找不到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;

}

0 0
原创粉丝点击