Block

os4.0系统已开始支持block

它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似

 

block其实就是一个函数指针,block可以看做是匿名函数的函数指针来对待。

 

Block会捕获外部变量,但是当你试图在Block里面修改捕获的外部变量时。就是出现编译错误,解决的一种办法是将外部变量使用 __block 修饰符修饰。

 

Block循环引用

在实际项目中对于Block最常见的问题应该是循环引用。如果Block中使用了 __strong 修饰符的对象,那么当block从栈复制到堆时,该对象为Block所持有。这样容易造成循环引用,

编译器来说, _obj 变量只不过是对象的成员变量罢了。

解决的方法便是便是通过 __weak 修饰符来修饰会被Block捕获的变量: 

关于Block的应用:

 

block  属性,一般用  copy  修饰;

    如果没有对block进行copy操作,block就存储于栈空间

    如果对 block 进行 copy 操作, block 就存储于堆空间 --- 强引用

    如果block存储于栈空间,不会对block内部所用到的对象产生强引用

    如果block存储于堆空间,就会对block内部所用到的对象产生强引用

注意 :由于使用了  copy  修饰,如果  block  中调用了  block  属性的对象,就会造成循环引用

 

了避免循环引用,需要对对象进行弱引用修饰:

xxx *x = [[xxx alloc] init]; 

// 1、修饰方法1 //
 __unsafe_unretained typeof(x) weakx = x;
 // 2、修饰方法2  
 __block typeof(x) weakx = x;  
 x.testBlock = ^{  [weakx run];  
 };

 简单应用

1
2
3
4
5
6
int(^getSum)(int,int) = ^(int num1,int num2) {
    return num1 +num2;
};
 
int sum = getSum(10,20);
NSLog(@"计算结果:%d",sum);

  

block传值

 

other.h

 

1
2
3
4
5
6
#import <Foundation/Foundation.h>
@interface Other : NSObject
typedef void (^myBlock)(NSString *str);
@property (nonatomic, copy) myBlock block;
- (instancetype)initWithBlock:(myBlock)block;
@end

  
other.m

1
2
3
4
5
6
7
8
9
10
11
12
#import "Other.h"
@implementation Other
- (instancetype)initWithBlock:(myBlock)block{
    self = [super init];
        if (self.block=block) {
     
            self.block(@"abcxxx");
     
        }
        return self;
}
@end

  调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import "ViewController.h"
#import "Other.h"
@interface ViewController ()
@property (nonatomic, copy) NSString *tempStr;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    Other *other = [[Other alloc]initWithBlock:^(NSString *str) {
        self.tempStr = str;
    }];
     
    NSLog(@"传来的结果是:%@",self.tempStr);
}
@end

  


__EOF__

本文作者若云
本文链接https://www.cnblogs.com/fucker/articles/5030955.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   若云  阅读(404)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示