一、 介绍OC中的属性和成员变量
属性(Property):一套对外声明 + 访问约定的语法糖,synthesize & denamic就是控制其是否编译器是否为其自动生成setter/getter方法以及对应的ivar,并且附带内存管理和线程语义
成员变量(ivar):对象在内存中实际存放的数据槽位,由类定义时确定布局,运行时直接存取
语法糖:语法糖(Syntactic Sugar)是编程语言中一种语法设计方式,旨在通过更简洁、易读的写法替代复杂的代码结构,但不会改变语言的实际功能或底层逻辑。其核心目的是提升代码的可读性和开发效率
成员变量(ivar)
-
ivar的偏移在编译期确实,对象的大小包含所以ivar
-
分类不能新增ivar,因为分类是运行时合并,此时布局已经确定
-
使用_xxx直接访问(绕过方法调用,更快),使用getter/setter访问(更安全,可以携带内存语义,KVO通知等)。
note:初始化与析构阶段(`init`/`dealloc`):推荐直接访问 ivar,避免 setter 的副作用
属性(property)
-
若未手写 getter/setter,编译器默认生成访问方法和一个名为 `_xxx` 的 ivar;
-
显式合成:`@synthesize xxx = _customIvar;`
-
禁止合成:`@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 级别(高层封装,易用)
基本属性动画:改变 `alpha`、`frame/center/bounds`、`transform`(缩放/旋转/平移)、`backgroundColor`或者使用 `UIView.animate(withDuration:...)`
过渡动画:`transition(from:to:options:)`、`transition(with:options:)`
弹簧动画:`usingSpringWithDamping`、`initialSpringVelocity`,实现回弹、阻尼效果
关键帧动画:`UIView.animateKeyframes` 分段定义关键帧,适合复杂节奏
Core Animation 级别CABasicAnimation:针对单一属性的 from/to/by,如 `opacity`、`position`、`bounds`、`cornerRadius`
CAKeyframeAnimation:多关键帧/路径动画(`path`),可做贝塞尔路径运动
CAAnimationGroup:多个动画并行/串行动画组
CATransition:`type`/`subtype` 控制淡入淡出、推入、揭开等
实际上,我们在开发的时候大多采用不复杂的动画,多数情况UIview的级别已经足够