• (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

      

    We're here to put a dent in the universe!code改变世界!-----------------------------------------------------by.不装b就无法活下去的晨曦
  • 相关阅读:
    noip退役赛
    noip模拟赛
    集合划分状压dp
    bzoj 3730 震波
    noip前打板子 qwq
    noip模拟赛
    HAOI2015 树上染色
    一个菜鸡出的模拟赛!
    ioinc
    centos=>gsutil,iptables
  • 原文地址:https://www.cnblogs.com/firstaurora/p/5190154.html
Copyright © 2020-2023  润新知