iOS面试题-OC部分

### iOS面试题-OC部分详解#### 1. Objective-C是否支持多继承?能否实现多个接口?Category是什么?重写类的方式是用继承还是用分类? - **Objective-C多继承:**Objective-C不直接支持多继承,即一个类不能直接继承自多个类。这种设计有助于避免多继承带来的复杂性问题,如钻石问题。 - **实现多个接口:**虽然Objective-C没有传统意义上的接口概念,但可以通过协议(protocol)来模拟接口的功能。一个类可以遵循多个协议,从而实现了类似多接口的功能。 - **Category(类别)简介:**Category是Objective-C中一种特殊机制,允许开发者向现有类添加新方法,无需修改原类的源代码。这意味着可以在不破坏封装性的前提下扩展类的功能。 - **重写类的方式选择:** - **继承vs.分类:**通常情况下,如果需要对类的行为进行较大的改变或添加大量新方法,推荐使用继承的方式。这是因为继承提供了完整的类行为替换,并且能够更清晰地表达新的类关系。而使用分类(类别)添加方法时,可能会覆盖原有的方法实现,导致不易察觉的行为改变。 #### 2.属性声明时,如何选择`retain`、`copy`或`assign`? - **`retain`:**当声明为`retain`时,该属性的赋值会增加其引用计数。这对于对象类型非常有用,因为可以确保对象在使用过程中不会被释放。例如: ```objective-c @property(nonatomic, retain) NSString *name; ``` - **setter方法示例:** ```objective-c -(void)setName:(NSString *)name { if (_name != name) { [_name release]; _name = [name retain]; } } ``` - **`copy`:**当属性需要指向不可变的副本时,应使用`copy`。这对于`NSString`、`NSArray`等类型尤其重要,以确保对象的不变性。例如: ```objective-c @property(nonatomic, copy) NSString *name; ``` - **setter方法示例:** ```objective-c -(void)setName:(NSString *)name { if (_name != name) { [_name release]; _name = [name copy]; } } ``` - **`assign`:**适用于基本数据类型,如`int`、`float`等,不需要处理引用计数。例如: ```objective-c @property(nonatomic, assign) int age; ``` #### 3. `NSMutableArray`与`NSArray`的选择- **`NSMutableArray`:**当需要频繁地添加、删除元素时,使用`NSMutableArray`更加合适。这是因为`NSMutableArray`提供了丰富的方法来操作数组内的元素。 - **`NSArray`:**对于只读的数据集合,推荐使用`NSArray`。它不允许修改数组内容,提供了一种更安全、更高效的方式来存储数据。 #### 4.实现字符串反转假设要将字符串"ILOVECHINA"反转为"CHINALOVEI",可以使用以下代码: ```objective-c NSString *originalString = @"ILOVECHINA"; NSMutableString *reversedString = [NSMutableString string]; for (NSInteger i = [originalString length] - 1; i >= 0; i--) { NSRange range = NSMakeRange(i, 1); [reversedString appendString:[originalString substringWithRange:range]]; } NSLog(@"Reversed String: %@", reversedString); ``` #### 5. `.pch`文件的作用- **预编译头文件**(`.pch`)的主要作用在于提高编译速度。在项目中,经常有一些头文件被频繁引用,如`UIKit`、`Foundation`等。通过将这些头文件包含在`.pch`文件中,可以让编译器预先编译这些文件,从而在后续编译过程中快速加载。 - **宏定义**:还可以在`.pch`文件中定义宏,使得这些宏在整个项目范围内都可用。 #### 6.解决重复编译问题为了避免重复编译,可以使用条件编译指令,如`#ifndef`、`#ifdef`等。例如: ```c #ifndef MYHEADER_H #define MYHEADER_H //头文件内容#endif // MYHEADER_H ``` #### 7. `awakeFromNib`与`viewDidLoad`的区别- **`awakeFromNib`**:当从`.nib`文件加载视图时,会自动调用此方法。适用于那些需要从界面构建器加载的视图对象。 - **`viewDidLoad`**:无论视图是从`.nib`文件还是通过代码初始化,都会调用此方法。通常用于执行初始化后的额外设置工作。 #### 8. `layoutSubviews`何时被调用- **初始化阶段**:`init`方法执行时不会触发。 - **滚动视图**:滚动`UIScrollView`时会触发。 - **屏幕旋转**:设备屏幕旋转时会触发。 - **视图尺寸变化**:当视图的`frame`发生改变时会触发。 - **视图大小调整**:调整`UIView`大小时会触发。 #### 9. `public`、`private`、`protected`的区别- **`public`**:公共成员可以在任何地方被访问,包括其他类和包。 - **`private`**:私有成员仅限于当前类内部访问。 - **`protected`**:受保护成员可以被当前类及其子类访问,也可以在同一包内的其他类访问。 #### 10. ARC(自动引用计数) - **简介**:ARC是Apple在iOS 5和OS X 10.7中引入的一项新技术,它自动管理对象的引用计数,简化了内存管理任务。 - **特点**:ARC通过编译器自动插入适当的`retain`和`release`语句,使得开发者无需手动处理内存管理。 - **区别于GC**:ARC不是垃圾回收机制。它基于静态分析技术,仅限于引用计数管理。
docx 文件大小:96.11KB