OC-034.block类型(封装代码)

本文深入探讨了Objective-C与Swift两种编程语言在iOS开发领域的应用,包括它们各自的优势、特点以及如何在实际项目中进行选择与运用。
block 是一种数据类型,它的作用是封装代码
函数不能在方法内部或函数内部,但是block可以

定义block类型的变量的格式
返回值类型 (^block变量名称)(形参列表);

实现格式
^ 返回值类型 (形参列表){ 语句..... };


在block 中可以访问局部变量的,只能读取,默认不能修改。
默认在block内部不能修改局部变量的值
如果想修改局部变量的值,要再定义这个变量的时候,在前面加上__block,但是效率会变慢,同时block代码内部的变量名虽然相同,但是实际上是同步出来的变量,从而导致运行效率变慢。

当你在block内部使用对象的时候,那么block内部就对这个对象有一个强引用,会在block出作用域的时候释放对象

#import <Foundation/Foundation.h>//------main
#import "LSMe.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //1.无参数,无返回值
        void (^block)() = ^{
            NSLog(@"hello");
        };
        block = ^{
            NSLog(@"nihao");
        };
        block();
        
        //2.有参无返回值
        void (^block2)(int num1,int num2) = ^(int num1,int num2){
            int a = num1 + num2;
            NSLog(@"a = %d",a);
        };
        block2(1,2);
        
        //3.有参有返回值
        int (^block3)(int num1,int num2) = ^(int num1,int num2){
            return  num1 + num2;
        };
        int a = block3(2,3);
        NSLog(@"a = %d",a);
        
        //4.block做为参数
        LSMe *me = [[LSMe alloc] init];
        int b = [me test:^int(int num1, int num2) { //作为实参需要写入实际的代码
            return num1 + num2;
        }];
        NSLog(@"b = %d",b);
        /*
         1、在block 中可以访问局部变量的
         默认在block内部不能修改局部变量的值
         如果想修改局部变量的值,要再定义这个变量的时候,在前面加上__block
         */

       __block int c = 20; //如果想在block内部改变变量的值,加__block前缀修饰,但是效率变慢
        void (^block4)()=^{
//            c = 30;不能直接去改变变量的值,但是可以读取
//            int c = 30; //在内部定义会覆盖外部的变量
            c = 50; //当外部写了__block,同样是c,但其实是不同的,会在代码内保持同步,效率变慢
            NSLog(@"c= %d",c);
        };
        block4();
        NSLog(@"c= %d",c);
        
        //当你在block内部使用对象的时候,那么block内部就对这个对象有一个强引用
        void (^block5)()=^{
            [me say];     //在block内部使用对象,可以理解为block5是一个强指针指向了对象
        };
        me = nil; //本来会在这行让LSMe释放,但是有block5的强指针指着,所以me是不会被释放的
     
    }//当block5出作用域被销毁的时候,那么me也被释放了。
    return 0;
}
#import <Foundation/Foundation.h>//------LSMe.h

@interface LSMe : NSObject
/*
 作为函数参数类型的格式
 返回值类型(^)(形参列表)
 */

- (int) test:(int (^)(int num1,int num2)) block;
- (void) say;

@end
#import "LSMe.h"//------LSMe.m

@implementation LSMe
- (int) test:(int (^)(int num1,int num2)) block{//这里的block传入的知识代码块
    return block(4,5);
}
-(void)dealloc{
    NSLog(@"%s",__func__);
}
- (void) say{
    NSLog(@"hello");
}

@end




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值