秋招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的级别已经足够

相关推荐
好好沉淀1 天前
1.13草花互动面试
面试·职场和发展
牛马1111 天前
iOS :Codable协议,字典,数组的详细分析和比较
ios
阿蒙Amon1 天前
C#每日面试题-常量和只读变量的区别
java·面试·c#
程序员小白条1 天前
面试 Java 基础八股文十问十答第八期
java·开发语言·数据库·spring·面试·职场和发展·毕设
xlp666hub1 天前
Linux 设备模型学习笔记(1)
面试·嵌入式
南囝coding1 天前
CSS终于能做瀑布流了!三行代码搞定,告别JavaScript布局
前端·后端·面试
踏浪无痕1 天前
Go 的协程是线程吗?别被"轻量级线程"骗了
后端·面试·go
一只叫煤球的猫1 天前
为什么Java里面,Service 层不直接返回 Result 对象?
java·spring boot·面试
求梦8201 天前
字节前端面试复盘
面试·职场和发展
千金裘换酒1 天前
LeetCode 二叉树的最大深度 递归+层序遍历
算法·leetcode·职场和发展