iOS高级开发工程师面试——Objective-C 语言特性

iOS高级开发工程师面试——Objective-C 语言特性

  • 一、多态
  • 二、继承
  • 三、代理(Delegate)
    • 1. 代理为什么用 weak 修饰呢?block和代理的区别?
  • 四、通知(NSNotificationCenter)
  • 五、KVC (Key-value Coding)
  • 六、属性
  • 七、`@property` [ˈprɒpəti]的本质是什么?ivar 、 setter 、getter 是如何生成并添加到这个类中的?
  • 八、@synthesize 、@dynamic 的区别
  • 九、UIView 和 CALayer 的关系?
  • 十、ViewController 不走 dealloc 的情况
  • 十一、viewController生命周期
  • 十二、NSCache 优于 NSDictionary 的几点?
  • 十三、id 和 instanceType 有什么区别?
  • 十四、self 和 super 的区别 ?
  • 十五、setNeedsDisplay 和 layoutIfNeeded 两者是什么关系?
  • 十六、KVO键值观察

一、多态

​ 多态表现为了三个方面:动态类型动态绑定动态加载。之所以叫做多态,是因为必须到运行时(run time)才会做一些事情。

  1. 动态类型:

    编译器编译的时候是不能被识别的(如 id 类型),要等到运行时(run time),即程序运行的时候才会根据语境来识别。所以这里面就有两个概念要分清:编译时运行时

  2. 动态绑定 :

    动态绑定(dynamic binding)貌似比较难记忆,但事实上很简单,只需记住关键词@selector/SEL即可。

    而在OC中,其实是没有函数的概念的,我们叫消息机制所谓的函数调用就是给对象发送一条消息。这时,动态绑定的特性就来了。OC可以先跳过编译,到运行的时候才动态地添加函数调用,在运行时才决定要调用什么方法,需要传什么参数进去。这就是动态绑定,要实现他就必须用SEL变量绑定一个方法,最终形成的这个SEL变量就代表一个方法的引用。动态绑定的特定不仅方便,而且效率更高。

  3. 动态加载 :

    让程序在运行时添加代码模块以及其他资源。用户可以根据需要加载一些可执行代码和资源,而不是在启动时就加载所有组件。可执行代码中可以含有和程序运行时整合的新类。

二、继承

OC 不支持多继承,但是可以用 代理(Delegate) 来实现多继承。runtime 消息转发等实现伪多继承。

三、代理(Delegate)

在这里插入图片描述
​代理是一种设计模式,以 @protocol 形式体现,一般是一对一传递

1. 代理为什么用 weak 修饰呢?block和代理的区别?

  • 一般以weak关键词以规避循环引用

    • weak 修饰指明该对象并不负责保持delegate这个对象,delegate 这个对象的销毁由外部控制。
    • strong 修饰该对象强引用 delegate,外界不能销毁 delegate对象,会导致循环引用。
  • block 和代理的区别:

    • 运行成本:代理运行成本低,block 运行成本高。
      因为block出栈需要将使用的数据从栈内存拷贝到堆内存,如果本身就在堆内存的话计数器会+1,使用完或block置为nil后才消除;
      delegate 只保留了一个指针对象,直接回调,没有额外的消耗
    • 写法更简练,更紧凑
    • block 注重结果的传输
    • block 要防止循环引用,善用 __weak 和 __strong
    • 公共接口,当方法较多后者调用太频繁建议用delegate

四、通知(NSNotificationCenter)

​ 使用观察者模式来实现的用于跨层传递信息的机制。传递方式是一对多的。

如果实现通知机制?
在这里插入图片描述

五、KVC (Key-value Coding)

键值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。非对象类型的变量将被自动封装或者解封成对象,很多情况下会简化程序代码。

1. KVC 底层实现原理
当一个对象调用setValue:forKey:方法时,方法内部会做以下操作:

  • 判断有没有指定 keyset方法,如果有set方法,就会调用 set 方法,给该属性赋值
  • 如果没有 set 方法,判断有没有跟 key 值相同且带有下划线的成员属性(_key) 如果有,直接给该成员属性进行赋值
  • 如果没有成员属性 _key ,判断有没有跟key 相同名称的属性。如果有,直接给该属性进行赋值
  • 如果都没有,就会调用 valueforUndefinedKey setValue:forUndefinedKey: 方法

2. KVC 使用场景

  • KVC 属性赋值
  • 添加私有成员变量
  • 字典和模型之间的互转

六、属性

OC 中,基本数据类型的默认关键字是atomic, readwrite, assign;普通属性的默认关键字是atomic, readwrite, strong

1. 读写权限readonlyreadwrite(默认)

2. 原子性: atomic(默认)nonatomicatomic读写线程安全,但效率低,而且不是绝对的安全,比如如果修饰的是数组,那么对数组的读写是安全的,但如果是操作数组进行添加移除其中对象的话,就不保证安全了。nonatomic

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

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

相关文章

MMpretrain 中的 LinearClsHead 结构与优化

LinearClsHead 结构与优化 一、LinearClsHead 核心结构 在 MMPretrain 中,LinearClsHead 是一个简洁高效的分类头,其核心结构如下: class LinearClsHead(BaseModule):def __init__(self,num_classes, # 类别数量in_channels, # 输入…

Spring 学习笔记

1.Spring AOP 怎么实现的AOP 即面向切面编程,是通过代理实现的,主要分为静态代理和动态代理,静态代理就是在程序运行前就已经指定并声明了代理类和增强逻辑,运行时就已经被编译为字节码文件了,而动态代理则是在运行过程…

【CVPR2024】计算机视觉|InceptionNeXt:速度与精度齐飞的CNN架构

论文地址:http://arxiv.org/pdf/2303.16900v3 代码地址:https://github.com/sail-sg/inceptionnext 关注UP CV缝合怪,分享最计算机视觉新即插即用模块,并提供配套的论文资料与代码。 https://space.bilibili.com/473764881 摘要…

7.15 窗口函数 | 二分 | 位运算 | 字符串dp

lc3316. 字符串dpdp多开一行一列后,注意原字符串下标映射dp[n][m] ( n 是source长度, m 是pattern长度)两重循环填表for i 1-nfor j 0-m三种状态转移1.不选 dp i jdp i-1 j2.不选if tag, dp[i][j]3.if(s ip j) 选,dp i…

Spring原理揭秘--初识AOP

我们知道软件开发一直在追求高效,易维护,易扩展的特性方式。在面向过程编程到面向对象编程的历程中,程序的开发有了非常大的进步。但是oop的方式缺依然存在着一些缺点。oop的方式可以将业务进行很好的分解和封装使其模块化,但是却…

Provider模式:软件架构中的“供应商“设计哲学

文章目录Provider模式:软件架构中的“供应商“设计哲学什么是Provider模式?经典应用场景1. 配置管理Provider2. 数据访问Provider4. 消息队列ProviderProvider模式的优势1. 解耦合实际项目中的应用Provider模式的最佳实践1. 命名约定2. 接口设计原则3. 错…

LTspic下载,帮助及演示电路

1.下载 LTspice是一款强大高效的免费SPICE仿真器软件、原理图采集和波形观测器,为改善模拟电路的仿真提供增强功能和模型。其原理图捕获图形界面使您能够探测原理图并生成仿真结果,这些结果可以通过内置波形查看器进一步观察分析。 链接: …

位置编码/绝对位置编码/相对位置编码/Rope原理+公式详细推导及代码实现

文章目录1. 位置编码概述1.1 为什么需要位置编码?2. 绝对位置编码 (Absolute Position Encoding)2.1 原理2.2 数学公式2.3 代码实现2.4 代码与公式的对应关系2.5 特性与优势2.6 可学习的绝对位置编码3. 相对位置编码 (Relative Position Encoding)3.1 原理3.2 数学公…

网络安全初级第一次作业

一,docker搭建和挂载vpm 1.安装 Docker apt-get install docker.io docker-compose 2.创建文件 mkdir /etc/docker.service.d vim /etc/docker.service.d/http-proxy.conf 3.改写文件配置 [Service] Environment"HTTP_PROXYhttp://192.168.10.103:7890…

交换类排序的C语言实现

交换类排序包括冒泡排序和快速排序两种。冒泡排序基本介绍冒泡排序是通过重复比较相邻元素并交换位置实现排序。其核心思想是每一轮遍历将未排序序列中的最大(或最小)元素"浮动"到正确位置,类似气泡上升。基本过程是从序列起始位置…

嵌入式 Linux开发环境构建之Source Insight 的安装和使用

目录 一、Source Insight 的安装 二、Source Insight 使用 一、Source Insight 的安装 这个软件是代码编辑和查看软件,打开开发板光盘软件,然后右键选择以管理员身份运行这个安装包。在弹出来的安装向导里面点击 next ,如下图所示。这里选择…

【字节跳动】数据挖掘面试题0016:解释AUC的定义,它解决了什么问题,优缺点是什么,并说出工业界如何计算AUC。

文章大纲 AUC(Area Under the Curve)详解一、定义:AUC是什么?二、解决了什么问题?三、优缺点分析四、工业界大规模计算AUC的方法1. 标准计算(小数据)2. 工业级大规模计算方案3.工业界最佳实践4.工业界方案选型建议总结:AUC的本质AUC(Area Under the Curve)详解 一、…

Python后端项目之:我为什么使用pdm+uv

在试用了一段时间的uv和pdm之后,上个月(2025.06)开始,逐步把用了几年的poetry替换成了pdmuv(pipx install pdm uv && pdm config use_uv true) ## 为什么poetry -> pdm: 1. 通过ssh连接到服务器并使用poetry shell激活虚拟环境之…

鸿蒙Next开发,配置Navigation的Route

1. 通过router_map.json配置文件进行 创建页面配置router_map.json {"routerMap": [{"name": "StateExamplePage","pageSourceFile": "src/main/ets/pages/state/StateExamplePage.ets","buildFunction": "P…

在 GitHub 上创建私有仓库

一、在 GitHub 上创建私有仓库打开 GitHub官网 并登录。点击右上角的 “” → 选择 “New repository”。填写以下内容: Repository name:仓库名称,例如 my-private-repo。Description:可选,仓库描述。Visibility&…

量产技巧之RK3588 Android12默认移除导航栏状态栏​

本文介绍使用源码编译默认去掉导航栏/状态栏方法,以触觉智能EVB3588开发板演示,Android12系统,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效…

Conda 安装与配置详解及常见问题解决

《Conda 安装与配置详解及常见问题解决》 安装 Conda 有两种主流方式,分别是安装 Miniconda(轻量级)和 Anaconda(包含常用数据科学包)。下面为你详细介绍安装步骤和注意要点。 一、安装 Miniconda(推荐&a…

Linux ——lastb定时备份清理

lastb 命令显示的是系统中 /var/log/btmp 文件中的SSH 登录失败记录。你可以像处理 wtmp 那样,对 btmp 文件进行备份与清理。✅ 一、备份 lastb 数据cp /var/log/btmp /var/log/btmp.backup.$(date %F)会保存为如 /var/log/btmp.backup.2025-07-14✅ 二、清空 lastb…

自定义类型 - 联合体与枚举(百度笔试题算法优化)

目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合练习二、枚举类型2.1 枚举类型的声明2.2 枚举类型的优点总结一、联合体 1.1 联合体类型的声明 像结构体一样,联合体也是由一个或者多个成员构成…

FS820R08A6P2LB——英飞凌高性能IGBT模块,驱动高效能源未来!

产品概述FS820R08A6P2LB 是英飞凌(Infineon)推出的一款高性能、高可靠性IGBT功率模块,采用先进的EconoDUAL™ 3封装,专为大功率工业应用设计。该模块集成了IGBT(绝缘栅双极型晶体管)和二极管,适…