局部Block及面试点

一、定义:

在 Objective-C 中,一个 block 是一种可以捕获周围上下文变量的匿名函数。当你想要定义一个只在当前作用域内使用的 block 时,你可以创建一个局部 block。以下是一个例子,展示如何用 Objective-C 写一个局部 block:

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {@autoreleasepool {// 定义一个局部 blockvoid (^myLocalBlock)(NSString *) = ^(NSString *name) {NSLog(@"Hello, %@", name);};// 调用这个局部 blockmyLocalBlock(@"World");}return 0;
}

在这个例子中,`myLocalBlock` 是一个局部 block,它接收一个 `NSString` 类型的参数,并输出一条欢迎信息。这个 block 被定义在 main 函数的局部作用域内,只能在这个作用域内被调用。

Block 也可以捕获外部变量。如果你想在 block 内部访问外部定义的变量,你需要在 block 外部定义这些变量,并确保它们有正确的存储类型。例如:

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {@autoreleasepool {NSString *greeting = @"Hello";// 定义一个局部 blockvoid (^myLocalBlock)(NSString *) = ^(NSString *name) {NSLog(@"%@, %@", greeting, name);};// 调用这个局部 blockmyLocalBlock(@"World");}return 0;
}

在这个例子中,`greeting` 是一个局部变量,它在 block 外部定义,并在 block 内部被捕获和使用。注意,block 默认是捕获变量的值,而不是引用,除非你使用 `__block` 存储类型修饰符。如果你打算在 block 内部修改外部变量,你应该使用 `__block`,如下所示:

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {@autoreleasepool {__block NSInteger counter = 0;// 定义一个局部 blockvoid (^incrementCounterBlock)(void) = ^{counter += 1;NSLog(@"Counter: %ld", (long)counter);};// 调用这个局部 blockincrementCounterBlock(); // Counter: 1incrementCounterBlock(); // Counter: 2}return 0;
}

在这个例子中,`counter` 变量被 `__block` 修饰符修饰,这允许 block 在被调用时修改 `counter` 的值。

二、循环引用:

在 Objective-C 中,局部 block 本身不会产生循环引用,因为它们通常是栈上的局部变量,并且在声明它们的作用域结束时会被销毁。循环引用(或称为保留(retain)循环)产生的情况通常涉及 block 捕获了它外部的对象,特别是当这些对象又持有这个 block 的强引用时。

下面是一个不会产生循环引用的局部 block 的例子:

void someFunction() {int localVariable = 42;void (^myBlock)(void) = ^{NSLog(@"Local variable: %d", localVariable);};myBlock(); // 此处调用 block,不会产生循环引用
}

在上面的代码中,myBlock 是一个局部 block,它捕获了 localVariable。当 someFunction 函数执行完毕后,myBlock 和 localVariable 都会从栈上移除,因此不存在循环引用。

循环引用通常发生在以下场景:

  1. 当一个对象持有一个 block 的强引用。
  2. 该 block 又捕获了这个对象,并持有其强引用。

例如:

@interface MyClass : NSObject
@property (nonatomic, copy) void (^myBlock)(void);
@end@implementation MyClass
- (void)configureBlock {__weak typeof(self) weakSelf = self; // 使用弱引用来打破循环引用self.myBlock = ^{__strong typeof(weakSelf) strongSelf = weakSelf; // 在 block 内部将弱引用升级为强引用以保证执行期间 self 不会被释放[strongSelf doSomething];};
}- (void)doSomething {// 做一些事情
}
@end

在上面的例子中,MyClass 的实例持有一个名为 myBlock 的 block。如果 myBlock 直接捕获 self 而没有使用弱引用 weakSelf,那么当 MyClass 的实例持有这个 block 时,就会产生循环引用。因为 self 持有 myBlock,而 myBlock 又捕获了 self,这样它们就相互持有对方的强引用。

为了打破这个循环,可以使用 __weak 关键字创建一个 self 的弱引用 weakSelf,然后在 block 内部使用这个弱引用。如果需要在 block 内部保证 self 在执行期间不会被释放,可以临时将 weakSelf 升级为强引用 strongSelf,如上面的例子所示。这种方式既防止了循环引用,又确保了在 block 执行期间 self 是存在的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[力扣题解]39. 组合总和

题目&#xff1a;39. 组合总和 思路 回溯法 代码&#xff0c;自己写的 // 自己写的 // 没有用 startindex 也可以实现&#xff01; class Solution { public: vector<vector<int>> result;vector<int> path;void function(vector<int>& candid…

使用docker安装seafile

使用docker安装seafile 1 介绍seafile Seafile 是一款开源的企业云盘&#xff0c;支持全平台&#xff08;浏览器、Windows、Mac、Linux、Android、IPhone等&#xff09;客户端。Seafile 内置协同文档 SeaDoc &#xff0c;让协作撰写、管理和发布文档更便捷。最重要的这是国产…

【网站项目】SpringBoot796水产养殖系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【JavaEE初阶系列】——Cookie和Session应用之实现登录页面

目录 &#x1f6a9;本章目标 1.登录页面 2.servlet处理上述的登录请求 3.网站主页(成功登录之后的页面&#xff09; &#x1f6a9;实现过程 &#x1f393;登录页面 &#x1f393;Servlet处理登录请求 &#x1f388;获取请求传来的参数(用户名和密码) &#x1f388;验证…

一件事做了十年

目录 一、背景二、过程1.贫困山区的心理悲哀2.基础差的客观转变3.对于教育的思考4.持续做这件事在路上5.同行人有很早就完成的&#xff0c;有逐渐放弃的&#xff0c;你应该怎么办&#xff1f;6.回头看&#xff0c;什么才是最终留下的东西? 三、总结 一、背景 在哪里出生我们无…

《Linux运维总结:ARM64架构CPU基于docker-compose一离线部署rabbitmq 3.10.25容器版镜像模式集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

c++题目_守望者的逃离

题目描述 恶魔猎手尤迫安野心勃勃.他背叛了暗夜精灵&#xff0c;率深藏在海底的那加企图叛变&#xff1a;守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上。为了杀死守望者&#xff0c;尤迪安开始对这个荒岛施咒&#xff0c;这座岛很快就会沉下去&#xff0c;到那时…

外贸客户开发用什么软件做?

外贸客户开发可以使用多种软件来完成&#xff0c;以下是一些常用的软件推荐&#xff1a; 即时通讯软件&#xff1a; SKYPE&#xff1a;一款功能丰富的即时通讯软件&#xff0c;支持视频聊天、多人语音会议、文件传输等&#xff0c;方便与海外客户进行实时沟通。Line&#xff1…

【ubuntu】ubuntu-18.04开机卡在Starting User Manager for UID 120....问题解决方案

错误截图 解决方案 启动系统&#xff0c;开机界面单击按键esc键&#xff0c;注意需要将鼠标定位到菜单界面&#xff0c;移动键盘上下键选择Advanced options for Ubuntu 进入如下菜单&#xff0c;选择recovery mode 回车之后会弹出如下界面&#xff0c;选择如下root&#xff0…

超详细的胎教级Stable Diffusion使用教程(四)

这套课程分为五节课&#xff0c;会系统性的介绍sd的全部功能和实操案例&#xff0c;让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion&#xff0c;它究竟有多强大&#xff1f; 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

【C语言/Python】嵌入式常用数据滤波处理:卡尔曼滤波器的简易实现方式(Kalman Filter)

【C语言/Python】嵌入式常用数据滤波处理&#xff1a;卡尔曼滤波器的简易实现方式&#xff08;Kalman Filter&#xff09; 文章目录 卡尔曼滤波卡尔曼滤波公式卡尔曼滤波数据处理效果C语言的卡尔曼滤波实现附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Pack…

Spring-Cloud-OpenFeign源码解析-01-OpenFeign简介

OpenFeign简介 OpenFeign是一种声明式、模板化的HTTP客户端(仅在Application Client中使用)。声明式调用是指&#xff0c;就像调用本地方法一样调用远程方法&#xff0c;无需感知操作远程http请求。 OpenFeign和Feign的区别 Feign是Spring Cloud组件中一个轻量级RESTful的HT…

亚信安全发布《2024年第一季度网络安全威胁报告》

亚信安全2024年第一季度网络安全威胁报告 一季度威胁概览 《亚信安全2024年第一季度网络安全威胁报告》的发布旨在从一个全面的视角解析当前的网络安全威胁环境。此报告通过详尽梳理和总结2024年第一季度的网络攻击威胁&#xff0c;目的是提供一个准确和直观的终端威胁感知。…

LNMP环境部署WordPress——使用源码包安装方式部署环境

目录 一.前提准备 二.源码安装Mysql 1.MySQL类型 2.MySQL 版本说明 3.MySQL 安装方式 3.1 yum 安装 3.2 编译安装 3.3 二进制安装 3.4 rpm 安装 4. 编译安装MySQL5.7 4.1 清理安装环境 4.2 创建mysql用户 4.3 从官网下载tar包 4.4 安装编译工具 4.5 解压 4.6 …

【教学类-55-01】20240511图层顺序挑战(四格长条纸)(4*4)和“手工纸自制参考图”

作品展示 背景需求 空间思维图层挑战2|逻辑推理|空间想象力 - 小红书 (xiaohongshu.com)https://www.xiaohongshu.com/discovery/item/62cbf6c60000000010026aa0?app_platformandroid&ignoreEngagetrue&app_version8.35.0&share_from_user_hiddentrue&typevi…

Django项目运行报错:ModuleNotFoundError: No module named ‘MySQLdb‘

解决方法&#xff1a; 在__init__.py文件下&#xff0c;新增下面这段代码 import pymysql pymysql.install_as_MySQLdb() 注意&#xff1a;确保你的 python 有下载 pymysql 库&#xff0c;没有的话可以使用 pip install pymysql安装 原理&#xff1a;用pymysql来代替mysqlL…

探索人类意识的多样性:从安全感到语感、节奏感的差异

在我们的日常生活中&#xff0c;人类意识表现出多种多样的特点&#xff0c;这些特点往往与个体的天生禀赋和生活经历密切相关。从安全感到语感、节奏感&#xff0c;每个人的表现都有所不同。今天&#xff0c;让我们一起来探索这些差异&#xff0c;感受人类意识的多样性。 首先&…

stable diffusion WebUi本地安装

一、stable diffusion 介绍 Stable Diffusion是一种先进的文本到图像的生成模型&#xff0c;它可以根据给定的文本输入生成高度逼真的图像。 Stable Diffusion模型因其高效性和灵活性&#xff0c;在AI图像生成领域引起了广泛关注&#xff0c;并在实际应用中展示了其强大的能力…

论文盲审吐槽多,谁给盲审不负责的老师买单?如何看待浙江大学「一刀切」的研究生学位论文双盲评审制度?

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

day6Qt作业

人脸识别系统 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> #include<opencv2/face.hpp> #include <vector> #include <map> #include <QMessag…