(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

 

  

posted @ 2016-02-16 10:17  FirstAurora  阅读(388)  评论(0编辑  收藏  举报