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

来源:互联网 发布:淘宝加购什么意思 编辑:程序博客网 时间:2024/05/17 05:17

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
0 0