结合之前的学习笔记以及参考《Objective-C编程全解(第三版)》,对Objective-C知识点进行梳理总结。知识点一直在变,只是作为参考,以苹果官方文档为准~
七、分类和延展
1、分类(范畴,类目,类别……)
(1)创建方式:File New -> OS X -> Source -> Objective-C File -> Category+FileName+Class(Xcode6.3)
(2)作用:在不修改原始类模型的基础上,给某个类扩充方法。分类提供简单的方式将类的定义模块化到相应地分类中,不需要创建子类就可以扩充方法
(3)语法:(假设给NSObject类添加Sort排序分类)
命名规则:“原始类+分类名”,在新建时输入分类名Sort,系统会自动生成“NSObject+Sort.h”“NSObject+Sort.m”
声明:NSObject+Sort.h
#import <Foundation/Foundation.h>
@interface NSObject (Sort)
//分类中不能添加成员变量
//{
// NSInteger _num;
//}
//报错:instance variables may not be placed in categories
//扩充方法的声明
- (void)methodA;
- (void)methodB;
@end
实现:NSObject+Sort.m
#import "NSObject+Sort.h"
@implementation NSObject (Sort)
//扩充方法的实现
- (void)methodA {
}
- (void)methodB {
}
@end
(4)分类的优点
a、一个庞大的类可以分功能模块进行开发
,思路更清晰,多人开发,利于团队合作;
b、在不修改原始类的基础上扩充方法;
c、不创建子类就能够进行当前类的方法扩充
(5)使用注意要点
a、分类只能扩充方法,不能扩充成员变量(要扩充用继承);
b、在分类方法中可以访问原始类中定义的成员变量;
c、分类允许重定义原始类中的方法,会覆盖原始类的方法,导致原方法不可用,不建议重定义;
d、当原始类,不同分类中有相同方法时,只有最后编译的有效
编译顺序查看:双击
方法调用顺序:分类(最后参与编译的分类优先)——>原始类
2、延展(extension) 本质是分类
(1)语法
@interface 类名 () //括号里可写可不写
//方法声明
@end
(2)作用:
a、在.m中,作私有方法的声明,同时实现方法(私有方法命名方法名前加下划线);
在Student.m中
#import "Student.h"
@interface Student (p1) //括号可写可不写,名字自己取
- (void) _showInfo;
@end
//可写多个
@interface Student (p2) //括号可写可不写,名字自己取
- (void) _showInfo2;
@end
@implementation Student
//私有方法实现
- (void)_showInfo {
// XXX;
}
- (void)_showInfo2 {
// XXXX;
}
@end
b、在.h中,按照功能模块进行区分,方便阅读和查找;
Student.h文件中
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
//XXX;
}
- (void)methodA;
@end
@interface Student (p) //括号可写可不写,名字自己取
- (void) showInfo; //公有方法,在.m中实现
@end
c、在foundation框架中经常使用此语法,方法是公有的,例如NSString.h,NSArray.h