分类与扩展

本文详细介绍了Objective-C中的分类和扩展的概念及其用法。分类可以为现有类添加新方法,但不能添加属性或实例变量;而扩展则可以在不公开内部细节的情况下添加新的实例变量和属性。

一,分类

分类不可以添加属性,在编译阶段不会报错,但是在运行的时候会报错,崩溃,原因是找不到setter方法

如果想要给分类添加属性,应该使用runtime,例如为分类添加属性:

@property (nonatomic,copyNSString *userId;

在.m文件中实现下面这两个方法

-(void)setUserId:(NSString *)userId

{

    objc_setAssociatedObject(selfNULL, userId,OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

-(NSString *)userId

{

    return objc_getAssociatedObject(selfNULL);

}

分类也不可以添加实例变量,在编译阶段就会报错;

分类可以添加方法;

分类方法添加注意点:

    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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值