ios面试总结
需积分: 0 63 浏览量
更新于2015-01-17
2
收藏 140KB DOCX 举报
### iOS面试知识点总结
#### 一、C语言基础
**1. 二叉树**
- **定义**: 二叉树是一种非线性数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。
- **遍历方法**: 包括前序遍历、中序遍历和后序遍历。
- **应用场景**: 在iOS开发中虽然不常见,但在理解数据结构和算法方面很有帮助。
**2. 二分查找**
- **原理**: 通过将目标值与数组中间元素进行比较,不断缩小搜索范围,直至找到目标值或范围为空为止。
- **时间复杂度**: O(logn),适用于有序数组。
- **空间复杂度**: O(1),是一种高效的查找算法。
**3. 冒泡排序与链表**
- **冒泡排序**: 通过重复地走访过要排序的数列,依次比较相邻的两个元素,如果顺序错误就把它们交换过来。
- **链表**: 一种常见的数据结构,每个节点包含数据和指向下一个节点的指针。
- **应用场景**: 链表在实现队列、栈等数据结构时非常有用。
**4. 双向链表**
- **定义**: 每个节点不仅有指向下一个节点的指针,还有指向其前一个节点的指针。
- **特点**: 双向链表支持双向移动,适用于需要频繁插入和删除操作的场景。
- **实例**: `NSArray` 不直接使用双向链表实现,但了解双向链表有助于理解数组类的内部机制。
**5. 哈希表**
- **原理**: 使用哈希函数将键映射到值的位置上,提供快速查找能力。
- **实现**: `NSDictionary` 是 iOS 开发中常用的哈希表实现之一。
- **应用场景**: 存储和检索键值对。
#### 二、iOS核心概念
**1. 代理模式**
- **定义**: 定义了一个接口,让客户端可以通过它与另一个对象进行交互。
- **应用场景**: 在实现相册功能时,使用代理模式可以方便地处理图片选择和上传等操作。
**2. ARC (自动引用计数)**
- **定义**: 由编译器自动管理对象的生命周期。
- **优点**: 减少内存泄漏的风险,提高代码可读性和维护性。
- **实现细节**: 如何正确使用 `strong` 和 `weak` 关键字来管理对象间的引用关系。
**3. UITableView优化**
- **优化技巧**:
- 使用单元格复用来减少内存占用。
- 对图片等资源进行异步加载和缓存。
- 减少视图层级,避免复杂的视图结构。
#### 三、Objective-C内存管理
**1. 黄金法则**
- **原则**: “谁创建谁释放”,但随着 ARC 的普及,这个规则更多用于手动管理内存的场合。
**2. retain点语法**
- **定义**: 用于手动增加对象的引用计数。
- **注意事项**: 在使用 ARC 时通常不需要手动调用。
**3. AutoreleasePool**
- **作用**: 延迟释放对象,直到当前的 autorelease pool 被释放。
- **使用场景**: 在循环或批量操作中,减少内存峰值。
**4. MyArray 实现**
- **自定义数组**: 通过实现自己的数组类来深入理解内存管理和容器类的设计。
**5. 浅拷贝与深拷贝**
- **浅拷贝**: 只复制对象的引用,而不复制引用的对象本身。
- **深拷贝**: 完全复制对象及其所有引用的对象。
- **应用场景**: 在需要复制对象时选择合适的拷贝方式。
**6. 自定义 AutoreleasePool**
- **实现细节**: 创建自定义的 autorelease pool 类,以便更精细地控制对象的生命周期。
#### 四、设计模式
**1. 单例模式**
- **定义**: 确保一个类只有一个实例,并提供一个全局访问点。
- **实现**: 通常使用类方法来创建和获取单例实例。
**2. 通知中心**
- **定义**: 一种观察者模式的实现,允许对象之间进行解耦通信。
- **应用场景**: 在多个组件间传递消息。
**3. KVO (键值观察)**
- **定义**: 允许观察对象属性的变化。
- **应用场景**: 在用户界面更新时,实时响应模型变化。
**4. KVC (键值编码)**
- **定义**: 提供了一种通过字符串名称访问对象属性的方法。
- **应用场景**: 动态设置或获取对象的属性值。
#### 五、缓存技术
**1. 文件缓存**
- **定义**: 将数据存储在文件系统中,以加速后续访问。
- **应用场景**: 图片、音频、视频等媒体文件的缓存。
- **策略**: 例如,设置缓存有效期(如10天),定期清理过期资源。
**2. 内存缓存**
- **定义**: 使用内存来缓存经常访问的数据。
- **应用场景**: 例如,通过缓存经常使用的图片来提高应用性能。
- **示例代码**:
```objective-c
static NSMutableArray *cacheArr = [[NSMutableArray alloc] init];
+(id)imageWithNamedWithCache:(NSString *)f {
NSString *s = [[NSBundle mainBundle] pathForResource:f ofType:nil];
NSData *d = nil;
// Check if the image is already cached
for (NSDictionary *mydict in cacheArr) {
d = [mydict objectForKey:s];
if (d) goto createImage;
}
d = [NSData dataWithContentsOfFile:s];
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:d, s, nil];
[cacheArr addObject:dict];
createImage:
UIImage *img = [[UIImage alloc] initWithData:d];
return [img autorelease];
}
```
**3. ASI 网络请求**
- **优点**: 简化了 HTTP 请求的处理,适合处理小数据量。
- **缺点**: 对于大数据量的下载可能不够高效。
- **建议**: 对于大文件(如超过10MB)的下载,推荐使用原生方法以获得更好的控制和效率。
#### 六、其他技巧
**1. 异步加载图片**
- **原因**: 保证应用界面的流畅性。
- **实现**: 通过后台线程下载图片,并在主线程中更新界面。
**2. 优化界面流畅性**
- **策略**:
- 使用异步加载资源。
- 复用 UI 元素,减少不必要的重绘。
- 降低视图的复杂度,避免过多嵌套。
以上总结了iOS面试中的关键知识点,涵盖了从C语言的基础到iOS开发中的高级概念和技术。这些知识点不仅是面试中常见的问题,也是实际开发中非常重要的基础知识和技术实践。希望这份总结能够帮助准备面试的开发者们更好地理解和掌握这些内容。