黑马程序员_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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值