类别和扩展

类别

通过类别可以动态的现有的类添加新方法,不需要创建子类,不需要访问原有类的源代码。
类别说明
1.通过类别为指定类添加新方法之后,这个方法不仅会影响该类,还会影响该类所有的子类。每个子类都会获取类别的扩展方法。
2.可以根据需要对一个类添加多个类别,不同的类别都可以对原有类增加方法定义。

案例:

#import <Foundation/Foundation.h>


@interface NSNumber (Calculate)

-(NSNumber*)add:(double)num2;

-(NSNumber*)substract:(double)num2;

-(NSNumber*)multiply:(double)num2;

-(NSNumber*)divide:(double)num2;

@end


#import "NSNumber+Calculate.h"


@implementation NSNumber (Calculate)

-(NSNumber*)add:(double)num2{

    return [NSNumber numberWithDouble:self.doubleValue+num2];

}

-(NSNumber*)substract:(double)num2{

    return [NSNumber numberWithDouble:self.doubleValue-num2];

}

-(NSNumber*)multiply:(double)num2{

    return [NSNumber numberWithDouble:self.doubleValue*num2];

}

-(NSNumber*)divide:(double)num2{

    return [NSNumber numberWithDouble:self.doubleValue/num2];

}

@end



#import <Foundation/Foundation.h>

#import "NSNumber+Calculate.h"


//通过类别来调用私有方法



int main(int argc, const char * argv[]) {

    @autoreleasepool {

        NSNumber *myNum = [NSNumber numberWithInt:3];

        NSLog(@"add=%@",[myNum add:5]);

        NSLog(@"substract=%@",[myNum substract:5]);

        NSLog(@"multiply=%@",[myNum multiply:5]);

        NSLog(@"divide=%@",[myNum divide:5]);

        

                

    }

    return 0;

}






使用场景
1.利用类别对垒进行模块化设计。
2.使用类别来调用私有方法。
案例

#import <Foundation/Foundation.h>


@interface Item : NSObject


@end


#import "Item.h"


@implementation Item

//私用方法

-(void)print{

    NSLog(@"打印了内容");

}

@end


#import <Foundation/Foundation.h>

#import "Item.h"

//通过类别来调用私有方法

@interface Item(aa)

-(void)print;

@end


int main(int argc, const char * argv[]) {

    @autoreleasepool {  

        Item*item = [[Item alloc]init];

        [item print];    

    }

    return 0;

}




3.使用类别来实现非正式协议
案例:

#import <Foundation/Foundation.h>


@interface NSObject (Eatable)

-(void)taste;

@end



#import "NSObject+Eatable.h"


@implementation NSObject (Eatable)


-(void)taste{

    NSLog(@"类别里面的");

}


@end


#import <Foundation/Foundation.h>

#import "NSObject+Eatable.h"


@interface Apple : NSObject


@end


#import "Apple.h"


@implementation Apple

-(void)taste{

    NSLog(@"苹果好吃");

}

@end



#import <Foundation/Foundation.h>

#import "Apple.h"


int main(int argc, const char * argv[]) {

    @autoreleasepool {

        Apple *app = [[Apple alloc]init];

        [app taste];

    }

    return 0;

}



扩展

扩展与类别相似,相当于匿名类别。
案例:

#import <Foundation/Foundation.h>


@interface Car : NSObject

@property (nonatomic,copy) NSString*brand;

@property (nonatomic,copy) NSString*model;

-(void)drive;

@end



#import "Car.h"

#import "Car+NewCar.h"


@implementation Car

@synthesize brand,model,color;


-(void)drive{

     NSLog(@"原方法");

}

-(void) drive:(NSString*)owner{

    NSLog(@"扩展方法");

}

@end


//扩展类

#import "Car.h"


@interface Car ()

@property (nonatomic,copy) NSString* color;

-(void) drive:(NSString*)owner;

@end



#import <Foundation/Foundation.h>

#import "Car.h"

#import "Car+NewCar.h"



int main(int argc, const char * argv[]) {

    @autoreleasepool {

        Car* car = [[Car alloc]init];

        [car drive];

        [car drive:@"我"];    

    }

    return 0;

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值