黑马程序员-[OC语言] 第五篇:block使用、协议概述

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

OC加强--第三天学习视频总结:


1.  block的概念及使用:
1)block定义格式:
无参无返回值:void  (^block  变量名)()=^( ){代码块的语句;};
例如:

有参无返回值:
void (^变量名)(参数的类型及个数)=^(形参列表){代码块语句;};
有参有返回值:
返回值类型 (^变量名)(参数的类型及个数)=^(形参列表){代码块语句;};
无参有返回值:返回值类型 (^block  变量名)()=^( ){代码块的语句;};

2. block的typedef:
1)格式为:typedef  返回值类型 (^ 新类型/别名)(参数类型列表);
2) 代码讲解实例:
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
       
        // 定义一个block变量,并且赋值
        void (^myBlock)() = ^{
        
            NSLog(@"helloworld");
        
        };
        myBlock();
        //定义一个别名
        // 给 没有返回值 没有参数的block起一个别名
        // Block 是一个类型,不在是一个单纯的变量了
        typedef void (^Block)();
        Block b1;
        //block类型的变量
        b1 =^{
            NSLog(@"helloworld");
        };
        
        b1();
        
        //定义有参数\有返回值的 block类型
        //定义新的别名
        //返回值是int 有两个 int类型的参数
        typedef int (^NewType1)(int ,int );
        
        NewType1 nt1 = ^(int a,int b){
        
            return a+b;
        
        };
        
        //连续定义多个 NewType类型的变量
        NewType1 n1,n2,n3;
        n1 = ^(int x,int y){
           
            return x>y?x:y;
        };
        
        int s = nt1(12,23);
        NSLog(@"s = %d",s);
        
        
    }
    return 0;
}
3. block访问外部变量问题:

1)当定义block的时候,block会把外部变量以const的方式复制一份,存放到block所在的内存中,此时存入了堆区;

2)而且block内部不允许修改外部变量值,

void test(){

    int m = 10;
    
    NSLog(@"1:m = %d",m);   //10
    NSLog(@"2:m addr = %p",&m);         //栈区
    
    void (^myBlock)()=^{

       m = 100;  // 错误,m的值不能被修改
        NSLog(@"5:m addr = %p",&m);     //堆区  
    };
    
    NSLog(@"4:m addr = %p",&m); //栈区
    //使用
    myBlock();
   }

3)当外部变量前面加上__block  时,此时不再以const方式复制,此时可以修改变量的值。

4)定义的全局变量,在block内部可以修改其值;


4. block 作为函数的返回值:
1)使用typedef 定义一个新的类型;
2)用新定义的的类型作为函数的返回值;
3) 定义block变量接收函数返回值;

4)调用block;

实例代码:

typedef void (^newType)();

//block类型作为函数的返回值
//2) 用新定义的类型作为函数的返回值
newType test(){
    //定义block变量
    newType w1 = ^{
    
        NSLog(@"xxxxx");
        NSLog(@"hello world");
    };

    return w1;  //返回值block

}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //定义block类型的变量
        //3) 定义block变量接收 函数返回的结果
        newType n1 = test();
        //4) 执行block
        n1();
    }
    return 0;
}
5. block使用技巧和注意事项:

1)block的助记符是inlineblock;
2) 我们在定义block变量的时候,形参类型及个数,这个位置处可以加上形参名称。

6. protocol的定义:
 1 )- 什么是协议?一些方法的声明,一般写到一个.h的头文件中
 方法有两种:1) 必须实现    2) 选择实现
 2) - 协议的作用:供其他的类去遵守,如果一个类遵守了一个协议,就应该实现这个协议中定义的必须要实现的方法
 3) - 如何定义一个协议:
       @protocol xxx <NSObject>  默认情况下遵守 NSObject协议

       @end

实现如下:

@protocol workProtocol <NSObject>
-(void)work;
@end

 4) - 类遵守协议的格式:
1) 遵守一个协议,先导入头文件    @interface 类名 :NSObject <xxx>@end

2) 遵守多个协议:@interface 类名 :NSObject <xxx,aaa,bbb>  @end

如:

//结论: 当我们遵守了某个协议后,就相当于这个类有了协议中所有的方法的声明
@interface Person : NSObject<baseProtocol>

7.protocol  使用注意事项:

1)  一个协议,可以遵守其他的协议(协议之间可以有继承关系)。
 2)  一个类可以遵守多个协议
 3)  一个协议可以被多个类遵守
4)protocol 就一个用途,用来声明一大堆方法(但是不声明实例比变量),不能实现方法;

8.protocol 中的@required 和@optional 协议关键字用法;
1)@required 表示要实现的方法;
2) @optional 可选择实现的方法,可以实现,也可以不实现;

9. protocol 的类型限制:
1)  使用ID存储对象时,对象的类型限制;
如:id <myprotocol>obj1;
2)  对象赋值时的类型限制:格式为:类名<协议名称>*变量名

3) 对象关联关系下,对象的类型限制

如:

@autoreleasepool {
        
        Dog *d = [Dog new];
        Girl *mm = [Girl new];
        
        NSString *str =@"";
        //增加类型限制
        // 第一种类型限制:给id类型增加限制
        // id<houseHold> obj;
        //增加<houseHold>以后,表示,obj只能赋值遵守了houseHold协议的对象
        //id<houseHold> obj = d;
        
        // 第二种类型限制:
        //表示,obj2赋值的时候,必须是Girl对象,并其遵守了 houseHold协议.
        Girl<houseHold> *obj2 = mm;
        
        // 第三种类型限制
        obj2.dog = d;
        
    }


10.Id 和instancetype 的区别:
1)instancetype只能作为函数或者方法的返回值;
2)Id 能作为方法或者函数的返回值,参数类型,也能用来定义变量;
3)instancetype 对比Id的好处是:能精确的限制返回值的具体类型;

11.protocol代理模式引入:
代理模式概念:传入的对象代替完成了某个功能,称为代理模式;

代理模式的场合使用:(1)监听场合(2)通知场合(3) 有些事情自己不想处理,交给别人处理。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值