分类
由于现在我们都是在@implementation和@end之间实现类的方法,就会使得类的方法多而且不方便查看使用,于是我们可以将方法的实现分散到不同的模块中。即实现某个类的部分方法的模块叫做范畴或类别(category)。
分类的声明
@interface 类名(范畴名)
/*声明的方法*/
@end
范畴的接口部分必须引用主文件的的接口文件
在Xcode中声明
再选择放置的文件夹
创建结束
分类的实现
@implementation 类名(分类名)
/*方法的定义*/
@end
- 范畴的实现部分必须引用对应的接口文件
- 使用范畴中的方法时必须引用这个方法在的头文件
局部分类的定义
通过在一个文件内定义方法+方法的实现
@interface (类名)范畴名可随意定义
- (int)methodA;
- (void)methodB;
@end
@implementation (类名)范畴名
- (int)methodA{
return 1;
}
- (void)methodB{
...
}
@end
即刻在局部范围内使用方法
类的私有方法
在范畴声明之后,需要考虑如何划分共有私有方法。
可以通过创建对外不公开的接口文件,其中声明类的共有变量和方法。
类扩展
由于把类划分成了多个范畴来实现,主类和各个范畴都是独立的,各个范畴都不清楚,但是会出翔个别时候忘记讲范畴链接进去的时候,这个时候就要类扩展了。
@interface 类名()
@end
声明时候只是圆括号没有别的,在声明类扩展的时候可以,增加实例变量。
属性声明
在范畴的接口中可以包含属性声明,但是在实现部分中不能包含@synthesize,范畴接口定义之后,要在实现部分手动定义访问方法,可以防止随意访问同一个类的不同文件中定义的实例变量。
新方法的覆盖
新定义的范畴中如果有和原方法重名的话,新定义的方法会覆盖老方法。也能给已有的类追加新的范畴NSString+Compare。
对象的可变性
OC中对象分为可变类和不可变类,他们的实例分别为可变实例和不可变实例
种类 | 不可变类 | 可变类 |
---|---|---|
数组 | NSArray | NSMutableArray |
数据 | NSData | NSMutableData |
词典 | NSDictionary | NSMutableDictionary |
集合 | NSSet | NSMutableSet |
字符串 | NSString | NSMutableString |
带属性的字符串 | NSAttributedString | NSMutableAttributedString |
字符集合 | NSCharacterSet | NSMutableCharacterSet |
索引集合 | NSIndexSet | NSMutableIndexSet |
不可变对象的概念在并行编程中很重要,因为可变对象的值可能会在不知不觉中被其他线程所修改。
-(id)mutableCopy
此方法为不可变对象创建一个可变的副本,通过给不可变对象发送此消息会生成一个和不可变对象内容一样的可变对象。
NSString
@"hello world"
通过用"“括起来加上@来形成一串字符串,这样定义的字符串是常量对象。@”"代表一个长度为0的字符串,和nil有区别。
快速枚举
for(变量 in 集合){
/*相应操作*/
}
通过for in 可以快速遍历所有集合中的对象。