------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
分类
1 分类就是类的补充和扩展,本质上是类的一部分,把一个类分成若干部分,每个部分就是分类。
2 语法
* 文件中的语法@interface 主类类名(分类类名)
* 文件名通常为:主类名+分类名
* 调用方法时,只需要向主类引用放送消息即可
3 使用分类的方式
* 可以给一个类增加功能(增加方法)
* 将类分成若干部分
* 分类不但可以给自定义的类添加功能,还可以给不知道源代码的类添加功能。
* 在分类中,不可以定义实例变量,也不可以定义属性,可以访问对象的属性。
* 在运行时,分类中的方法与类原有的方法并无区别,其代码可以访问包括私有类成员变量在内的所有成员变量。
* 若分类声明了与类中原有方法同名的函数,则分类中的方法会被调用。因此分类不仅可以增加类的方法,也可以代替原有的方法。这个特性可以用于修正原有代码中的错误,更可以从根本上改变程序中原有类的行为。若两个分类中的方法同名,则被调用的方法是不可预测的。
通常来讲,分类是定义在.h文件中,但也可以定义.m文件中,此时分类的方法就变成私有方法
//Fraction声明
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
{
int _numerator;
int _denominator;
}
@property (nonatomic,assign) int numerator;
@property (nonatomic,assign) int denominator;
- (void) setNumerator:(int)numerator andDemominator:(int)denominator;
- (void) reduce;
- (Fraction *) add:(Fraction *)fraction;
- (double) convertToNum;
- (void) print;
@end
// Fraction类实现
#import "Fraction.h"
@implementation Fraction
- (void)setNumerator:(int)numerator andDemominator:(int)denominator
{
_numerator = numerator;
_denominator = denominator;
[self reduce];
}
- (void)reduce
{
int num = _numerator;
int dem = _denominator;
int temp;
while (dem) {
temp = num%dem;
num = dem;
dem = temp;
}
_numerator /= dem;
_denominator /= dem;
}
-(Fraction *)add:(Fraction *)fraction
{
_numerator = _numerator*fraction.denominator + _denominator*fraction.numerator;
_denominator = _denominator*fraction.denominator;
[self reduce];
return self;
}
- (double)convertToNum
{
double convert = _numerator/_denominator;
return convert;
}
-(void)print
{
NSLog(@"%i/%i",_numerator,_denominator);
}
@end
//Fraction类的FrozenMathOps分类声明
#import "Fraction.h"
@interface Fraction (FrozenMathOps)
- (Fraction *) add:(Fraction *)fraction;
- (Fraction *) mul:(Fraction *)fraction;
- (Fraction *) sub:(Fraction *)fraction;
- (Fraction *) div:(Fraction *)fraction;
- (void) fra;
@end
//Fraction类的FrozenMathOps分类实现
#import "Fraction+FrozenMathOps.h"
@implementation Fraction (FrozenMathOps)
- (Fraction *)add:(Fraction *)fraction
{
_numerator = _numerator*fraction.denominator + _denominator*fraction.numerator;
_denominator = _denominator*fraction.denominator;
[self reduce];
return self;
}
- (Fraction *) mul:(Fraction *)fraction
{
_numerator = _numerator*fraction.denominator - _denominator*fraction.numerator;
_denominator = _denominator*fraction.denominator;
[self reduce];
return self;
}
- (Fraction *)sub:(Fraction *)fraction
{
_numerator = _numerator*fraction.numerator;
_denominator = _denominator*fraction.denominator;
[self reduce];
return self;
}
- (Fraction *)div:(Fraction *)fraction
{
_numerator = _numerator*fraction.denominator;
_denominator = _denominator*fraction.numerator;
[self reduce];
return self;
}
- (void)fra
{
NSLog(@"frozen");
}
@end
// Fraction类的o分类声明
#import "Fraction.h"
@interface Fraction (o)
- (void) fra;
@end
// Fraction类的o分类实现
#import "Fraction+o.h"
@implementation Fraction (o)
- (void)fra
{
NSLog(@"o");
}
@end
//主头文件
#import <Foundation/Foundation.h>
#import "Fraction.h"
#import "Fraction+FrozenMathOps.h"
#import "Fraction+o.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Fraction *fra = [[Fraction alloc] init];
[fra fra];
}
return 0;
}
输出结果与编译的顺序有关,编译靠后的分类“特权高”,即分类方法名相同,执行编译靠后的分类。方法的优先顺序为
分类(后编译分类>先编译分类)>该类>父类
协议
1 协议就是规则,定义一个协议就相当于制定规则。
OC中类遵守协议,就相当于拥有了一种能力。
2 语法
@protocol协议名
@required声明必须遵守的属性和方法
@optional声明可选的属性和方法
默认@required
3 一个类遵守一个协议
@interface 类名(分类名):父类名 <协议名>
4 使用协议类型的引用指向实现了协议或者遵守了协议的对象,id<TRProtocal> p = [[MyClass] init];
[p ];可以向协议的引用发送消息,只能发送协议要求的消息
5 协议的继承相当于协议的合并
6 一个类可以同时遵守多个协议,协议之间用","号分开
7 如果一个类遵守一个协议,那么它的子类也遵守。
8 协议的使用和多态相类似,可以用作数组、参数、返回值类型,只不过多态返回的对象,一定要有继承关系,协议类型返回的对象,一定要有遵守协议或实现协议。
3.代理模式
(由别人帮自己实现某个功能的模式称为代理模式)
1)接受代理
@ interface 类名:父类名 <协议名>(多个协议之间用逗号隔开)
….
@end
2)确认协议
@implementation类名
协议方法
{
}
@end
(代理是谁,谁接受并确认协议)
4.注意
1)协议声明了可以被任何类实现的方法。
2)协议定义了一个其他对象可以实现的接口。