iOS开发者专题OC学习码神之路:Object-C篇

六、Objective-C 类别Category和扩展Exten

2018-07-18  本文已影响3人  Yink_Liu

Objective-C学习索引

一、类别

一般情况下,我们在.m文件中的@implementation和@end之间实现类的方法,我们也可以用类别的方式:实现某各类的一部分方法的模块。
1、类别也是在.h文件定义,.m文件实现。
2、不能声明实例变量,只能声明方法。可以是实例方法/类方法。
3、类名必须是已经存在的类。
假设已经有一个学生类,类别定义举例如下:

// Student+Dance.h
#import "Student.h"
@interface Student (Dance) // 类别名
- (void) dance;
@end

// Student+Dance.m
#import "Student+Dance.h"
@implementation Student (Dance) // 类别名
- (void) dance{
    NSLog(@"dance");
}
@end

// test
//#import “Student.h”  这里可以不包括,因为Student+Dance.h已经调用过这句话了
#import "Student+Dance.h” 
Student * s =  [[Student alloc] init];
[s dance];

1、可以不创建新文件,直接写到学生类里。
2、类别的接口部分必须引用主文件的接口文件
3、类别的实现部分必须引用对应的接口文件
4、类别的.h中包含属性声明的情况下,实现部分需要手动定义访问方法。(防止随意访问同一个类的不同文件中定义的实例变量)
、类别中如果有方法和原有的方法重名,定义的方法就会覆盖老方法。(不建议,容易引起问题,比如多个类别定义相同名字的方法,执行的时候就无法保证到底执行了哪个方法)
5、给现有的类增加新方法,而不用继承它。(例如UIcolor,我们可以增加类别,添加方法直接读取“#125462”这样的值来转换颜色,而不用继承它,还有一些一些类似NSString的类族的形式,添加类别的方式来添加方法就用的恰到好处)
6、使用类别添加方法很方便,但不要滥用。

二、类别的前置声明

我们来看这样一个例子

// student.h
@interface Student : NSObject
@end

// student.m
@implementation Student
- (void)dance {
    NSLog(@"dance");
}
@end

这个时候我们定义一个 Student * s = [[Student alloc] init];
实例s是无法访问dance方法的,dance只能在类中访问。因为它未在.h中公开
我们新建一个类别Student+Dance.h

// Student+Dance.h
@interface Student (Dance)
- (void)dance;
@end

// Student+Dance.m
@implementation Student (Dance)
@end

这个时候我们再调用,就骗过编译器,就能调用这个方法了,而.m文件中什么都没有写。

Student * s =  [[Student alloc] init];
[s dance];

小结
前置声明:在类别的.h文件中声明类的私有访问,使其骗过编译器,能够被访问到。我们可以用来调试一些私有方法。

三、类扩展

我们创建一个类扩展 Student+Sing.h

#import "Student.h"
@interface Student (){
    //变量
}
// 方法
- (void)sing;
@end

类扩展(Extension)的声明和类别类似,只是括号内没有文本。
1、它的实现必须在类的实现文件中。这里也就是Student.m
2、类扩展的声明可以用在import了类的主接口和扩展声明的类别中,即Student.m,Student+Dance.m

上一篇 下一篇

猜你喜欢

热点阅读