秋招ios面试 -- 真题篇(三)

一、 介绍OC中的属性和成员变量

属性(Property):一套对外声明 + 访问约定的语法糖,synthesize & denamic就是控制其是否编译器是否为其自动生成setter/getter方法以及对应的ivar,并且附带内存管理和线程语义


成员变量(ivar):对象在内存中实际存放的数据槽位,由类定义时确定布局,运行时直接存取
语法糖:语法糖(Syntactic Sugar)是编程语言中一种语法设计方式,旨在通过更简洁、易读的写法替代复杂的代码结构,但不会改变语言的实际功能或底层逻辑。其核心目的是提升代码的可读性和开发效率

成员变量(ivar)

  1. ivar的偏移在编译期确实,对象的大小包含所以ivar

  2. 分类不能新增ivar,因为分类是运行时合并,此时布局已经确定

  3. 使用_xxx直接访问(绕过方法调用,更快),使用getter/setter访问(更安全,可以携带内存语义,KVO通知等)。

note:初始化与析构阶段(`init`/`dealloc`):推荐直接访问 ivar,避免 setter 的副作用

属性(property)

  1. 若未手写 getter/setter,编译器默认生成访问方法和一个名为 `_xxx` 的 ivar;

  2. 显式合成:`@synthesize xxx = _customIvar;`

  3. 禁止合成:`@dynamic xxx;`,此时实现需要在运行时提供

我们可以使用属性修饰符来对属性进行修饰,常用如下

|-------------------------|----------------------------------|
| strong | 持有:默认对对象属性:会增加引用计数 |
| weak | 不持有:被引用对象释放后自动置为nil |
| copy | 拷贝一份:用于防御性编程,避免外部修改 |
| assign | 简单复制,用户基本类型,用于对象危险(悬挂指针) |
| unsafe_unretained | 与 assign 类似,但语义化为"非安全不保留引用",不会置零 |
| atomic | getter/setter 做最小原子保护 |
| nonatomic | 无锁:性能更好 |
| readwrite | 可读可写 |
| readonly | 只读 |
| `getter=`/`setter=` | 自定义方法名 |
| nullable | 可谓空 |
| nonnull | 不可为空 |

二、什么是沙盒模型

沙盒模型:ios中的Sandbox是一套进程级别的安全隔离机制,每个App都运行在自己被隔离的文件系统和权限范围内,默认无法访问其余App的数据,系统敏感权限或者越权API

一般来说,沙盒包含的主要边界如下

  • App.bundle 只读,应用资源
  • Documents:用户数据
  • Library/Application Support 应用支持数据
  • Library/Cache 缓存
  • tmp 临时文件

访问摄像头、麦克风、照片、通讯录、蓝牙、定位、通知等都需要 Info.plist 声明和用户授权。

一般来说:把用户重要数据放在 `Documents` 或 `Library/Application Support`;缓存放 `Caches`;临时文件用 `tmp`。

三、IOS的系统架构

|----------------------------|
| 应用层(App Layer) |
| 框架层(Frameworks) |
| 核心服务层(Core Services) |
| 内核与硬件层(Kernel & Hardware) |

应用层:你的应用(.app)、App Extension、Widget、App Clip 等。

  • App生命周期
  • 路由与导航(UINavigationController、UITabBarController、SwiftUI NavigationStack)
  • 数据存储(UserDefaults、Keychain、文件系统、数据库)
  • 网络(URLSession)、媒体(AVFoundation)、推送通知(UserNotifications)
  • 设备能力:相机/麦克风/定位/蓝牙/HealthKit/CarPlay(需权限与 Entitlements)

框架层:提供高层次的系统框架,支撑 UI、媒体、设备、网络等常见功能。

如UIKit,SwiftUI,CoreLocation。。。。。

核心服务层:系统通用服务与中间层能力,供上层框架与 App 使用。

如Foundation,Core Foundation,Core Data。。。。。

内核与硬件层:XNU 内核:Mach + BSD

四:简述视图控制器的生命周期

init(控制器对象创建) -> loadView -> viewDidLoad(视图加载完成)

viewWillAppear -> viewDidAppear

viewWillDidappear -> viewDidDisAppear

viewWillLayoutSubviews :即将完成子视图布局

viewDidLayoutSubviews:完成布局

viewWillTransition:横竖屏切换或者尺寸类变化的时候回调

五:动画的基本类型有哪几种

UIView 级别(高层封装,易用)

  1. 基本属性动画:改变 `alpha`、`frame/center/bounds`、`transform`(缩放/旋转/平移)、`backgroundColor`或者使用 `UIView.animate(withDuration:...)`

  2. 过渡动画:`transition(from:to:options:)`、`transition(with:options:)`

  3. 弹簧动画:`usingSpringWithDamping`、`initialSpringVelocity`,实现回弹、阻尼效果

  4. 关键帧动画:`UIView.animateKeyframes` 分段定义关键帧,适合复杂节奏
    Core Animation 级别

CABasicAnimation:针对单一属性的 from/to/by,如 `opacity`、`position`、`bounds`、`cornerRadius`

CAKeyframeAnimation:多关键帧/路径动画(`path`),可做贝塞尔路径运动

CAAnimationGroup:多个动画并行/串行动画组

CATransition:`type`/`subtype` 控制淡入淡出、推入、揭开等

实际上,我们在开发的时候大多采用不复杂的动画,多数情况UIview的级别已经足够

相关推荐
YunQuality1 小时前
六西格玛黑带三个月拿证经验分享
笔记·职场和发展·职场·学习方法
报错小能手1 小时前
ios开发方向——swift并发进阶核心 async/await 详解
开发语言·ios·swift
人道领域1 小时前
【LeetCode刷题日记】242.字母异位词
算法·leetcode·职场和发展
开心就好20251 小时前
HTTPS超文本传输安全协议全面解析与工作原理
后端·ios
XWalnut1 小时前
LeetCode刷题 day8
算法·leetcode·职场和发展
张元清1 小时前
不用 Server Components 也能做 React 流式 SSR —— 实战指南
前端·javascript·面试
却话巴山夜雨时i1 小时前
互联网大厂Java面试:从Spring到微服务的全栈挑战
java·spring boot·redis·微服务·面试·kafka·技术栈
杰克尼1 小时前
springCloud(day10-面试篇)
redis·spring cloud·面试
Ricky111zzz2 小时前
leetcode学python记录2
python·算法·leetcode·职场和发展
yuki_uix2 小时前
只渲染「必要的部分」:从 DepartmentTree 和 VirtualList 看前端的两种裁剪哲学
前端·面试