(Object-C)学习笔记(四) --OC的协议、分类、扩展
OC的协议
协议就是规则,定义了一个协议就相当于制定了一个规则。OC中的类可以遵守规则,遵守协议的类就相当于多了一种或几种能力。将一些属性和方法方法放到一个协议里,可以方便的添加进其他类里面。
协议的定义:
@protocal
@required 声明必须遵守的属性和方法 默认
@optional 声明可选遵守的属性和方法
@end
协议的遵守:
@interface TRMyClass : NSObject<TRMyProtocol> 协议在尖括号中 若是遵守多个协议 @interface TRClassC : NSObject<TRProtocol4, TRProtocol5>
创建一个协议:
选中Object - C File 进去。
类型选择协议。
协议是一个.h文件:
1 #import <Foundation/Foundation.h> 2 3 @protocol TRMyProtocol <NSObject> 4 @property NSString *name; 5 -(void)show; 6 @end
遵守协议的类
TRMyClass.h
1 #import <Foundation/Foundation.h> 2 #import "TRMyProtocol.h" 3 4 @interface TRMyClass : NSObject<TRMyProtocol> 5 @property NSString *zsname; 6 -(void)fun; 7 @end
TRMyClass.m
1 #import "TRMyClass.h" 2 3 @implementation TRMyClass 4 @synthesize name = _name; 5 6 -(void)show 7 { 8 NSLog(@"1名字是%@", self.name); 9 NSLog(@"2%@",self.zsname); 10 self.zsname = @"李四"; 11 NSLog(@"3%@",self.zsname); 12 NSLog(@"4%@",_name); 13 14 } 15 16 -(void)fun 17 { 18 NSLog(@"非协议方法"); 19 } 20 21 @end
main.m
1 #import <Foundation/Foundation.h> 2 #import "TRMyProtocol.h" 3 #import "TRMyClass.h" 4 5 void test() 6 { 7 id<TRMyProtocol> ref = [[TRMyClass alloc] init]; 8 ref.name = @"张三"; 9 [ref show]; 10 //[ref fun]; 11 } 12 int main(int argc, const char * argv[]) { 13 14 @autoreleasepool { 15 16 17 18 test(); 19 20 21 22 } 23 24 return 0; 25 26 }
OC的分类
什么是分类:
分类是类的补充和扩展部分
分类是类的一部分
分类给类添加特定能力
创建一个分类:
选择 Category
下面的Class变成可选的
TRFraction.h
1 #import <Foundation/Foundation.h> 2 3 @interface TRFraction : NSObject 4 @property int n; 5 @property int d; 6 -(void)fun; 7 -(void)show; 8 @end
TRFraction.m
1 #import "TRFraction.h" 2 #import "NSObject+TRShow.h" 3 4 @implementation TRFraction 5 -(void)fun 6 { 7 NSLog(@"in main class fun"); 8 } 9 -(void)show 10 { 11 [super show]; 12 NSLog(@"%d/%d", self.n, self.d); 13 } 14 @end
TRTest.h
1 #import "TRFraction.h" 2 3 @interface TRFraction (TRTest) 4 -(void)showTest; 5 @end
这里也可以重写show方法,我因为其他的分类重写了show方法,如果在这个分类再写show方法有警告。
TRTest.m
1 #import "TRFraction+TRTest.h" 2 3 @implementation TRFraction (TRTest) 4 -(void)showTest 5 { 6 NSLog(@"秀一下Test"); 7 } 8 @end
main.m里面import一下就可以使用分类的方法,分类的方法相当于类的方法,没什么区别。
http://www.cnblogs.com/wendingding/p/3709569.html
OC的扩展(延展)
延展是特殊的分类,延展是没有名字的分类。延展一般定义在.m文件中,延展可以定义属性、方法、实力变量,以上都是私有的,只能在.m文件里使用。
分类与延展的区别
分类:分类不能定义变量,通常是公开的,分类文件名“主类类名+分类类名”
延展:延展通常是私有的,可以定义实例变量,延展文件名“主类类名_延展类名”
TRFraction.h
1 #import <Foundation/Foundation.h> 2 3 @interface TRFraction : NSObject 4 @property int n; 5 @property int d; 6 -(void)show; 7 @end
TRFraction.m
1 #import "TRFraction.h" 2 #import "TRFraction_myExtension.h" 3 4 @interface TRFraction ()//无名的分类是扩展 5 @property int value;//私有的 6 -(void)extensionMethod1;//私有的 7 @end 8 9 @implementation TRFraction 10 -(void)show 11 { 12 NSLog(@"%d/%d", self.n, self.d); 13 } 14 -(void)extensionMethod0 15 { 16 NSLog(@"扩展方法"); 17 } 18 -(void)extensionMethod1 19 { 20 NSLog(@"扩展方法1"); 21 } 22 @end