天天看点

黑马程序员_OC学习之block、protocol、categories

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

一、block:block是OC中特有的数据类型。作用与函数类似

定义:返回值 (^myBlock)(形参类型) = ^(类型 形参//这里如果没有参数可以省略括号){//定义格式与指向函数的指针相似

//代码

return ....;

}; //这里不要忘加分号

例如:

<span style="font-size:18px;">#import <Foundation/Foundation.h>

typedef int (^myBlock) (int,int);   //每次定义都很麻烦,可以生成定义模版

int main() {
    
   __block int a = 0;
    int b = 1;
    
    int (^sumBlock)(int,int) = ^(int a, int b) {    //定义格式与指向函数的指针类似
      
        return a+b;
    };  //定义一个block
    
    myBlock minusBlock = ^(int a, int b) {  //用生成的模版定义
        
        return a-b;
    };

    void (^testBlock)() = ^ {
        a = 2;
//        b = 3;    //这句会报错,因为默认block不可以修改局部变量
    };
    
    NSLog(@"a=%d,b=%d",a,b);
    
    NSLog(@"%d",sumBlock(2,4)); //调用方法与函数相同
    NSLog(@"%d",minusBlock(8,6));
    
    return 0;
    
}</span>
           

总结:

1、block内部可以访问外面的变量;

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

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

用途:

1、快速枚举;

2、向方法中传递block;

3、灵活代码。

--------------------------------------------------------------------------------------------------------------------------------------------------------

二、protocol(协议):类似于JAVA中的接口,用来声明方法,通常用在代理模式中

用途:

1、可以用来声明一大堆方法(不能声明成员变量)

2、只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明

3、只要父类遵守了某个协议,就相当于子类遵守了

例如:

<span style="font-size:18px;">#import <Foundation/Foundation.h>

@protocol myProtocol <NSObject>

@required   //必须实现方法(默认)

- (void)test;

@optional   //可选实现方法

- (void)test2;

@end

@interface Person : NSObject <myProtocol>

@end

@implementation Person

- (void)test {  //实现必须实现的方法,可选方法test2不实现也不会报警告
    
    NSLog(@"test");
}

@end

int main() {
    Person *p = [[Person alloc]init];
    
    [p test];
    
    [p release];
    
    return 0;
    
}</span>
           

总结:

1、一个协议可以遵守其他多个协议,多个协议之间用逗号隔开;

2、一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明;

3、NSObject有一个基协议,最根本最基本的协议,协议中声明了许多方法比如 description、retain、release等;

4、建议每个新的协议都要遵守NSObject协议。

三、categories(类别、分类、类目):不改变原来某类文件的情况下为某一个类添加新的方法

例如:

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person

@end

@interface Person (J)
- (void)test;
@end

@implementation Person (J)  //为Person这个类添加一个分类,括号中填的是自己为该分类起的名字

- (void)test {
    NSLog(@"test");
}

@end

int main() {
    Person *p = [[Person alloc]init];
    
    [p test];
    
    return 0;
    
}
           

注意:catecoriges不可以为类添加成员变量。

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com