1?? 协议Protocol
- 创建自己的协议
//定义MyPerson协议,NSObject是基协议 @protocol MyPerson<NSObject>//@required修饰的方式是必须实现的,没有实现就会出现警告 @required -(void)test; -(void)test1;//@optional不要求实现 @optional -(void)test2;@end
遵循协议
-只要遵循一个协议,就拥有了该协议的所有方法
-允许遵循多个协议<1,2>。不可以多继承,但可以遵循多个协议
3. 子类继承父类,子类也遵循父类遵循的协议,也拥有该协议的所有方法
4.一个协议遵循另外一个协议,该协议也会拥有另外一个协议的所有方法
@protocol MyProtocol2 <MyProtocol>@end
5. 不能在协议中定义成员变量,只能用来声明方法
6. 当协议只给单个类遵守则可以放在类的.m文件中,若协议有多个类遵守就单独建文件声明协议
7. 与@class一样可以在.h文件中声明,在.m中使用他们的方法
//.h
@protocol MyProtocol
@protocol MyProtocol2//.m
#import "MyProtocol.h"
#import "MyProtocol2.h"
2??分类的使用
1. 给一个类创建一个分类 Person+eat.h
#import "Person.h"@interface Person(eat)
{//分类中不能定义成员变量
}
//分类中也不建议写属性@property
-(void)eatFish;@end
2. 实现eatfish: Person+eat.m
#import "Person+eat.h"@implemention Person(eat)-(void)eatFish{_age = 10;NSLog(@"我吃了%d条鱼!",_age);
}
3. 分类只能访问@protected和@public修饰的成员变量
4. 当本类和分类中有相同的方法时,优先调用分类中的方法
5. 分类和子类一样,都不能访问本类中的@private成员变量
6. 子类可以调用父类中分类的方法
3??类扩展的使用
正常类的声明格式:@interface 类名 :NSObject
分类格式:@interface 类名(分类名)
类扩展:@interface 类名()
1. 创建一个类扩展
#import "Person.h"@interface Person()
{@publicint _height;
}
-(void)run;@end
2. run方法可以访问本类中所有的成员变量
3. 类扩展实现真正的私有(在.m文件中创建类扩展)
-类扩展声明的方法必须实现
-子类无法通过任何方式访问父类中类扩展的方法和成员变量
-使用@property修饰的成员变量外界仍然无法访问
4. 总结
-子类不能访问父类类扩展中的成员变量
-子类不能访问父类类扩展中的方法
-子类不能访问父类类扩展中用@property修饰的成员变量
4??分类与类扩展的区别
-分类中只能增加方法
-类扩展不仅可以增加方法,还可以增加成员变量,只是该成员变量是私有的,作用范围只在自身类,而不再子类或者其他类。
-类扩展不能像分类那样拥有独立的部分(@implementation)也就是说,类扩展中声明的方法,必须依托对应的本类的.m文件来实现
-定义在.m文件中的类扩展的成员变量和方法是私有的,定义在.h文件中的类扩展的成员变量和属性是公有的,类扩展是.m文件中声明私有方法非常好的方式。