bruceyou1990-iOS学习日记-分类(Category) 和 扩展(Extension)

版权声明:Coder Bruce https://blog.csdn.net/bruceyou1990/article/details/52824398

1.分类(Category)

主要格式:类名+分类名 分类主要是为类(Car)扩展方法(run)这个分类我们写成Car+run
主要的价值在于不用知道类(car)做了什么事情为去添加一个分类(run)实现代码逻辑分离降低耦合性

创建分类
一在项目里面按command+N 在iOS Source选择 objective-C File
在弹窗里面 File Type: 选择Category Class:(你要写分类的类)创建好后有两个文件,中间有个 “类名+分类名”。

Car+run.h

#import "Car.h"
@interface Car (run)
- (void)run;
@end

Car+run.m

#import "Car.h"
@interface Car (run)
- (void)run;
@end

在ViewController里面导入 #import “Car+run.h”就可以通过Car这个实例调run这个方法

ViewController.m

#import "ViewController.h"
import "Car+run.h"
@class Car
@interface ViewController
@end

@impelamation  ViewController
 -(void)Viewdidload{
[suoer viewdidload];
Car  *car=[[Car  alloc]init];
[car  run];//这时候就可以通过Car的实例调用分类的run方法
 }

分类 Category 添加属性
类无法直接添加属性 直接添加之后自动生成声明方法 而不会实现方法但是可以通过runtime底层语言添加属性

导入#import<objc/runtime.h>才能在分类中添加属性

并在Car+run.m里面这样写

/** 属性的get方法 */

- (NSString *)name
{
return objc_getAssociatedObject(self, _cmd);

}

/** 属性的set方法 */

- (void)setName:(NSString *)name

{

objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_RETAIN);

}

2.类扩展(Extension)简介

类扩展是分类的一个特例。
Extension是Category的一个特例。 表现特征为匿名,并且添加的方法一定要实现。(category可以不实现)。因此又叫匿名分类。可以为一个类添加额外的变量,方法或者合成属性。
扩展的价值:隐藏分类名不被发现

还是那前面那个Car 来举例

Car.h

#import <Foundation/Foundation.h>
@interface Car : NSObject
- (void)testRun;
@end

Car_extension.h(Car要用到的 run work 方法 在这个扩展中声明 到 才Car的.m文件中实现这个方法)

Car_extension.h
#import "Car.h"
@interface Car ()
{
    int _height;
}
- (void)run;
- (void)work;
@end

Car.m

#import "Car_extension.h"
@interface Car()

{
    int _year;
}
- (void)run;
@end

@implementation Car
- (void)work{
    NSLog(@"使用年限%d",_year);
    NSLog(@"working。。。");
    NSLog(@"高度多少位 :%d",_height);
}
- (void)run{
    NSLog(@"running ....");
    NSLog(@"%d",_year);
    -height=3;
}
- (void)testRun{
    [self run];
    NSLog(@"高度多少位 :%d",_height);
}
@end

猜你喜欢

转载自blog.csdn.net/bruceyou1990/article/details/52824398
今日推荐