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博客

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

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

相关文章

纯血鸿蒙APP实战开发——Worker子线程中解压文件

介绍 本示例介绍在Worker 子线程使用ohos.zlib 提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作,解压成功后将解压路径返回主线程,获取解压文件列表。 效果图预览 使用说明 点击解压按钮,解压test.zip文件,显…

IT行业的现状与未来趋势:技术革新与人才培养的双轮驱动

IT行业的现状与未来趋势:技术革新与人才培养的双轮驱动 在数字化浪潮的推动下,IT行业已经成为全球经济的重要引擎。云计算、大数据、人工智能、物联网、5G通信和区块链等技术的发展,正在深刻地影响着我们的生活和工作。以下是对IT行业现状及…

golang并发模型CSP(Communicating Sequential Processes)

文章目录 golang并发模型CSP(Communicating Sequential Processes)Golang CSPChannel参考 golang并发模型CSP(Communicating Sequential Processes) CSP 模型是托尼霍尔(Tony Hoare)在 1978 年提出的&…

算法刷题 地毯 错题 尚未解决

题目链接&#xff1a;P3397 地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ac答案&#xff1a; #include<stdio.h> int a[1002][1002];//a[0][],a[][0]初始化为0int main () {int n,m;scanf("%d %d",&n,&m);int i,j;int x1,y,x2,y2;//(x1,y1):…

掌握核心概念:Java高级面试难题精解(一)

Java 高级面试问题及答案 问题1: 在Java中&#xff0c;什么是泛型擦除&#xff1f;为什么需要它&#xff1f; 答案&#xff1a; 泛型擦除是Java编译器的一个特性&#xff0c;它在运行时移除泛型类型信息&#xff0c;以确保类型安全。Java的泛型是在J2SE 1.5中引入的&#xff…

数据分析推动业务增长

请详细阐述如何利用数据分析推动业务增长&#xff0c;并给出具体的事例和解释。您可以从以下几个方面展开&#xff1a;1. 数据驱动决策&#xff1a;如何通过数据分析为业务决策提供依据&#xff0c;实现更有效的策略制定。 2. 用户行为分析&#xff1a;如何通过分析用户行为数据…

03-行为型模式(共10种)

上一篇: 02-结构型设计模式(共7种) 1. Strategy(策略模式) 策略模式是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装到独立的类中&#xff0c;并使它们可以互相替换。这样可以使算法的变化独立于使用算法的客户端。 在 C 中&#xff0c;策略模式…

20-LINUX--网络编程

一. 主机字节序列和网络字节序列 主机字节序列分为大端字节序和小端字节序&#xff0c;不同的主机采用的字节序列可能不同。大 端字节序是指一个整数的高位字节存储在内存的低地址处&#xff0c;低位字节存储在内存的高地址 处。小端字节序则是指整数的高位字节存储在内存的高…

保温杯盖一般是什么材质的?

保温杯盖一般是什么材质的&#xff1f; Pi材料&#xff0c;也称为聚酰亚胺&#xff08;Polyimide&#xff09;&#xff0c;具有多种特殊性能和应用领域&#xff0c;主要作用如下&#xff1a; 1. 高温耐性&#xff1a;Pi材料具有出色的高温稳定性&#xff0c;能够在高温环境下长…

国内常用的项目管理软件有哪些?六大企业级项目管理软件大盘点

一、 奥博思 PowerProject 项目管理软件 官方网址&#xff1a;http://www.powerproject.com.cn 北京奥博思软件技术有限公司自成立以来&#xff0c;一直专注于企业级项目管理软件的开发及解决方案&#xff0c;致力于为各类企业&#xff08;制造业、IT交付、金融、汽车及汽车零…

供应链投毒预警 | 开源供应链投毒202404月报发布(含投毒案例分析)

概述 悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;发现大量的开源组件恶意包投毒攻击事件。在2024年4月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;…

什么是检索增强生成(Retrieval Augmented Generation)?RAG 架构如何实现?

检索增强生成&#xff08;Retrieval Augmented Generation&#xff09;时代 在不断发展的生成人工智能世界中&#xff0c;检索增强生成 (RAG) 标志着一项重大进步&#xff0c;它将检索模型的准确性与生成模型的创造性相结合&#xff0c;达到了准确&创新的更高层级。 这种…

Nginx 7层负载均衡的搭建

目录 负载均衡的理解 修改配置文件 测试 1. 选择在 DMZ 区测试&#xff0c;使用 db 服务器进行测试 2.选择在外网测试负载均衡效果 负载均衡的理解 负载均衡&#xff1a;load balancer&#xff0c;简称LB Nginx 既是一个 web 服务器软件&#xff0c;也是一个负载均衡软件&a…

【NLP】文本分类

n-gram 的局限性 n-gram 只能对于填空这样的通顺性问题做出推测&#xff0c;但是没有办法完全解决句子的语义问题&#xff0c;从而无法实现文本的分类 文本的分类&#xff0c;就是将文本在语义的理解下划分到特定的主题下 手工规则 如一些垃圾过滤系统&#xff0c;需要人工制…

企业或者个体户为什么会经营异常?

在复杂多变的市场经济环境中&#xff0c;无论是企业还是个体工商户&#xff0c;都可能遭遇经营异常的情况。及时识别这些预警信号并采取有效措施&#xff0c;对于避免潜在风险、保持健康发展至关重要。本文将深入探讨企业与个体户常见的经营异常类型、识别方法以及应对策略&…

有趣的css - 文字隐身术效果

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是利用动画属性来模拟文字隐身消失的效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样…

深度学习感悟

我觉得万事万物都逃不过yf(x)这个关系,输入在某种法则作用下变成了输出,这个用来理解宇宙,就是我们知道宇宙的现状,就是y,知道自然法则,就是f,我们不知道的是x,其实深度学习也是如此,模型要找的是f,通过不断减小预测和真实值的 损失来找最好的w和b,而这个就是f,最好的f应该是方…

php解密工具

在线编辑器 复制如下代码到空白地区: <?php namespace FatSmallTools; class NavicatPassword {protected $version 0;protected $aesKey libcckeylibcckey;protected $aesIv libcciv libcciv ;protected $blowString 3DC5CA39;protected $blowKey null;protected $b…

MCULCD屏驱动方法

MCULCD屏驱动方式 一、LCD简介二、直接采用8080时序驱动LCD三、采用FSMC&#xff08;模拟8080时序&#xff09;驱动LCD1&#xff0c;FSMC简介2&#xff0c;结构框图3&#xff0c;FMC 驱动 LCD 显示配置步骤 一、LCD简介 Liquid Crystal Display&#xff0c;即液晶显示器&#…