Object-C——其他语法

一、protocol协议

     1、协议的定义

@protocol 协议名称 <NSObject>
  // 方法声明列表....
 @end

     2、如何遵守协议
       ①  类遵守协议

@interface 类名 : 父类名 <协议名称1, 协议名称2>
 
 @end

      ②  协议遵守协议

@protocol 协议名称 <其他协议名称1, 其他协议名称2>
 
 @end

     ③  协议中方法声明的关键字

 1> @required (默认)
   要求实现,如果没有实现,会发出警告
1 @required
2 - (void)test;
3 - (void)test2;
2> @optional
   不要求实现,怎样不会有警告

   

1 @optional
2 - (void)test3;

         ④  定义一个变量的时候,限制这个变量保存的对象遵守某个协议

           类名<协议名称>*变量名;

           id<协议名称> 变量名;

NSObject<MyProtocol> *obj;
 id<MyProtocol> obj2;

         如果没有遵守对应的协议,编译器会警告

         ⑤  @property中的声明的属性也可用作一个遵守协议的限制

@property (nonatomic, strong) 类名<协议名称> *属性名;
 @property (nonatomic, strong) id<协议名称> 属性名;

 @property (nonatomic, strong) Dog<MyProtocol> *dog;
 @property (nonatomic, strong) id<MyProtocol> dog2

        ⑥  协议可用定义在单独.h文件中,也可以定义在某个类中

           *如果这个协议只用在某个类中,应该把协议定义在该类中

           *如果这个协议用在很多类中,就应该定义在单独文件中

        ⑦  分类可用定义在单独.h和.m文件中,也可用定义在原来类中

           *一般情况下,都是定义在单独文件

      3、程序举例

 1 // 要求obj3保存的对象必须是遵守是MyProtocol这个协议
 2     
 3     //NSObject<MyProtocol> *obj3 = [[NSObject alloc] init];
 4     
 5     NSObject<MyProtocol> *obj3 = [[Person alloc] init];
 6     
 7     obj3 = nil;
 8     
 9     
10     id<MyProtocol> obj4 = [[Person alloc] init];
11     
12     obj4 = nil;
13     
14     // 要求obj5,保存的对象必须遵守MyProtocol3、并且继承了Person
15     Person<MyProtocol3> *obj5 = [[Person alloc] init];
16     
17     obj5 = nil;

二、block
      block封装了一段代码,可以在任何时候执行,block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值

      1、 block的定义       

1 int (^sumBlock)(int, int);
2  void (^myBlock)();

      2、 利用block封装代码

^(int a, int b) {
    return a - b;
 };
 
 ^() {
    NSLog(@"----------");
 };
 
 ^ {
    NSLog(@"----------");
 };
 

      3、block访问外面的变量
         ①  block内部可以访问外面的变量

         ②  默认情况下,block内部不能修改外面的局部变量

         ③  给局部变量加上__block关键字,这个局部变量就可以在block内部修改

 1 void test3()
 2 {
 3     int a = 10;
 4     __block int b = 20;
 5     
 6     void (^block)();
 7     
 8     block = ^{
 9         // block内部可以访问外面的变量
10         //NSLog(@"a = %d", a);
11         
12         // 默认情况下,block内部不能修改外面的局部变量
13         // a = 20;
14         
15         // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
16         b = 25;
17     };
18     
19     
20     block();
21 }

      4、 利用typedef定义block类型

 1  MyBlock block;
 2  MyBlock b1, b2;
 3  
 4  b1 = ^(int a, int b) {
 5     return a - b;
 6  };
 7  
 8  MyBlock b3 = ^(int a, int b) {
 9     return a - b;
10  };
11  */
12 
13 typedef int (*SumP)(int, int);
14 
15 
16 typedef int (^MyBlock)(int, int);
17 
18 int sum(int a, int b)
19 {
20     return a + b;
21 }

      

        

原文地址:https://www.cnblogs.com/gaizuojia/p/4357607.html