Block常见面试题精华版

block本质是什么,需要注意什么?

Block 的本质是一个封装了函数和函数调用环境(捕获的变量)的 Objective-C 对象。Block 的实现基于 C 语言的函数指针,但它们比普通的函数指针更加强大,因为它们能够捕获周围的状态。

在 Objective-C 中,每个 block 实际上是一个结构体,该结构体包含了几个重要的元素:

  1. isa 指针,表明这是一个对象,并指向该 block 类型的类对象。
  2. 函数指针,指向 block 的执行体(即 block 里写的代码)。
  3. 捕获的变量的副本,block 能够捕获其作用域内的变量,这些变量在 block 被定义时拷贝到了 block 结构体中。
  4. 引用计数,用于在非 ARC 环境下管理 block 的生命周期。
  5. 其他用于管理 block 生命周期和状态的字段。

使用 block 时需要注意以下几个方面:

  1. 循环引用:Block 内部如果捕获了 self 或其成员变量,且 self 同时持有这个 block,会产生循环引用,导致内存泄漏。为了打破循环引用,通常会使用 __weak 关键字来声明一个 self 的弱引用。

  2. 内存管理:在非 ARC 环境下,需要手动管理 block 的拷贝和释放。在 ARC 环境下,block 通常会自动从栈复制到堆上,但仍需要注意循环引用问题。

  3. 变量捕获:Block 只能捕获其作用域内的变量的值,如果需要在 block 内部修改外部变量,那么这个变量必须使用 __block 修饰符声明。

  4. 执行环境:Block 在定义时捕获变量的状态,而不是在执行时,所以 block 内部看到的外部变量是在 block 创建时的快照。

  5. 性能考虑:频繁地创建和销毁大量的 block 可能会对性能造成影响,特别是当这些 block 被拷贝到堆上时。同时,block 捕获大量数据时也会增加内存使用。

  6. 线程安全:如果 block 在多线程环境中执行,需要确保 block 内部访问的数据是线程安全的。  

  延伸: block性能考虑和线程安全

理解并注意以上方面,可以有效地使用 block 编程,同时避免常见的陷阱和错误。

1.局部block:

        局部Block-CSDN博客

2.gcd:​​​   

        GCD与Block

3.函数参数是block,调这个block中使用self:

        函数参数是block-CSDN博客

4.什么时候strong;

在 Objective-C 中,当你在 block 内部使用 weakSelf 并希望在 block 执行的过程中确保被捕获的对象不会被释放,你会将 weakSelf 转换为 strongSelf

这个模式是一种预防性的做法,用以确保在 block 执行的时候,即使是在异步操作中,对象(通常是 self)仍然存在。如果不这么做,在异步操作中,self 可能会在 block 执行之前被释放,尤其是当 block 执行不是立即发生时。一旦 self 被释放,尝试访问 weakSelf 将返回 nil,并且在 block 内部调用 self 的方法或者访问其属性将不会执行任何操作。

这是将 weakSelf 转换为 strongSelf 的模式:

__weak typeof(self) weakSelf = self;
self.myBlock = ^{
    // 将弱引用的 weakSelf 转换为强引用的 strongSelf
    __strong typeof(weakSelf) strongSelf = weakSelf;
    // 确保 strongSelf 在 block 执行时还存在
    if (strongSelf) {
        [strongSelf doSomething];
        // 其他使用 strongSelf 的代码...
    }
    // 如果 strongSelf 为 nil,则意味着原始的 self 已经被释放
};

在这个模式中,一旦 block 开始执行并且 strongSelf 被成功创建,self 的生命周期就会在 block 执行的过程中得到保证。如果 strongSelf 为 nil,则表示原始的 self 已经被释放,block 内部的代码应该处理这种情况,避免执行任何依赖于 self 存在的操作。

总结来说,将 weakSelf 转换为 strongSelf 是为了:

  • 确保在 block 的执行期间,self 不会被释放。
  • 允许 block 在 self 不存在时正确地处理这种情况,通常是直接返回或者执行一些不依赖于 self 的操作。

这种做法是一种推荐的编程模式,可以避免循环引用的同时也确保了代码的稳定性和安全性。

5. 什么时候拷贝到堆上;

        block什么时候拷贝到堆上-CSDN博客

6.weak的本质;

        待总结;

7.是否是OC对象?

        Block是OC对象吗-CSDN博客

 8.Block为什么不能为nil?

        OC中Block为什么不能为nil-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024 年适用于 Mac 的 5 大最佳免费数据恢复工具

一个常见的误解是,数据恢复总是很昂贵。实际上,您可以在 2024 年下载许多适用于 Mac 的免费数据恢复软件工具,并使用它们来恢复丢失的数据,而无需将 Mac 交给数据恢复专业人员,他们保证会向您收取一小笔费用他们的服务…

Ansys Mechanical|中远程点的Behavior该如何设置?

Remote point是ANSYS mechanical中的一种常见节点自由度耦合建模形式,在转动装配体中的连接转动副、或者在施加远端约束及远端载荷的时候,我们经常用到远端单元来耦合一个面或者一条线。例如销轴似的滚动摩擦连接,如果我们希望将两个物体通过…

Linux ps命令详细参数

一、简介 在Linux系统中,ps(Process Status的缩写)命令常常用来用来列出系统中当前运行的进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。要对进程…

【动态规划】子序列问题II|最长定差子序列|最长的斐波那契数列的长度|最长等差数列|等差数列的划分

一、最长定差子序列 1218. 最长定差子序列 算法原理: 💡细节: 1.正常创建dp表,分析状态转移方程:可能b存在于多个不同的位置,那么要用哪个下标的dp呢? 用最后一个b的,因为用前面的可…

springboot3.0+继续使用springboot2.0配置会显示 `无法自动装配,找不到对应的Bean`解决方法

在 Spring Boot 3.0 中,Spring 团队对自动配置机制进行了重大变更,特别是 spring.factories 文件。spring.factories 文件已被 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件所取代。在springboot3.0继续使用…

Danfoss丹佛斯S90泵比例放大器

S90R042、S90R055、S90R075、S90R100、S90R130、S90R180、S90R250电气排量控制变量泵比例阀放大器,电气排量控制为高增益控制方式:通过微小变化的输入电流控制信号即可推动伺服阀主阀芯至全开口位置,进而将最大流量的控制油引入到伺服油缸。伺…

搭建Prometheus+grafana监控系统

1. 项目目标 (1)熟练部署安装node_exporter (2)熟练部署安装prometheus (3)熟练部署安装grafana 2. 项目准备 2.1. 规划节点 主机名 主机IP 节点规划 prometheus-server 10.0.1.10 server prome…

光伏运维系统在光伏电站的应用

摘要:全球化经济社会的快速发展,加快了传统能源的消耗,导致能源日益短缺,与此同时还带来了严重的环境污染。因此,利用没有环境污染的太阳能进行光伏发电获得了社会的普遍关注。本文根据传统式光伏电站行业的发展背景及其监控系统的技术设备,给出了现代化光伏电站数据…

手机IP地址:固定还是动态?探寻背后的变化之谜

在数字化时代的今天,手机作为我们日常生活中必不可少的通讯工具,扮演着越来越重要的角色。其中,IP地址作为手机在网络世界中的“身份证”,对于手机的正常运作至关重要。然而,很多人对于手机IP地址的固定性存在疑问&…

电子合同怎么盖章的

数字证书盖章:利用个人或企业的数字证书进行盖章。数字证书作为数字身份证明,确保了电子签名和盖章的可信度。通过加密技术,确保合同内容不被篡改,盖章过程完成后,合同具有法律效力。 时间戳盖章:在电子合…

【AI绘画】Stable diffusion初级教程08——提示词(prompt)该如何写

今天是一篇干货,干的喝水的那种…… 写之前呢,先给大家打个比方:现在刚入门学习SD的相当于刚上学的小学生,提示词就相当于作文,还是英语作文,如果你总是抄抄抄,不知道作文的要点,语法…

实验10 协作图

一、实验目的 通过绘制活协作图,掌握协作图的基本原理。能对简单问题进行协作图的分析与绘制。 二、实验项目内容(实验题目) 考试成绩管理系统是举行成人高考、自学考试等成人高校对每个参与考试的学员成绩进行综合管理的一个系统。本系统的…

redis7基础篇2 redis的3种模式(主从,哨兵,集群)模式

一 主从复制模式 1.1 主从模式 主从模式: 主机可以读,写,重机只能写操作。 主机shutdown后,从机上位还是原地待命:从机不动,原地待命,数据正常使用,等待主机重启归来。 主机shu…

输入法变了 输入的地方由原来的一条线变成了小白方块,打完字后还会把原来的字覆盖掉

今天工作是,不知道不小心点了什么按键后,输入法变了, 输入的地方由原来的一条线变成了小白方块,打完字后还会把原来的字覆盖掉 之前都是,重启解决这个问题的,今天不想重启了,重启后打开工作用的…

在Linux上面部署ELK

注明:一下的软件需要自己准备 一、准备环境: 1.两台elasticsearch主机4G内存 2.两台elasticsearch配置主机名node1和node2(可以省略) #vim /etc/hostname #reboot 3. 两台elasticsearch配置hosts文件 #vim /etc/hosts 192.168.1.1 node1 192…

OpenCompass大模型离线测评

一、目录 环境配置环境测试本地模型测评 二、实现 环境配置 >>创建环境 conda create --name opencompass python3.10 pytorch torchvision pytorch-cuda -c nvidia -c pytorch -ysource activate opencompass git clone https://github.com/open-compass/opencompas…

第 8 章 机器人底盘Arduino端PID控制(自学二刷笔记)

重要参考: 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 8.4.5 底盘实现_04Arduino端PID控制 上一节最后测试时,电机可能会出现抖动、顿挫的现象&#xff…

力扣HOT100 - 62. 不同路径

解题思路&#xff1a; 动态规划 注意要初始化第一行和第一列的值 class Solution {public int uniquePaths(int m, int n) {int[][] dp new int[m][n];for (int i 0; i < m; i) {dp[i][0] 1;}for (int j 0; j < n; j) {dp[0][j] 1;}for (int i 1; i < m; i) {…

快手截流多功能协议引流多线程多账号使用

在市场上&#xff0c;类似的软件售价都在几千元&#xff0c;但我发现这款全新版本的软件已经更新&#xff0c;而且我只需要配合使用谷歌浏览器&#xff0c;稍微调慢一点延时&#xff0c;我就可以像专业人士一样流畅地进行操作。 评论对于我而言是一种艺术&#xff0c;而不仅仅是…