在iOS面试过程中,面试官可能会考察求职者的Objective-C编程基础和设计模式理解。以下是一些关键知识点的详细解析:
1. **类与继承和Category**:
- Objective-C不支持多重继承,因为它采用的是消息传递机制而非传统的类层次结构。但是,可以通过实现多个协议(即接口)来模拟C++中的多重继承行为,每个协议代表一个接口,类可以实现多个协议。
- Category是一种在不改变已有类结构的情况下,向已有类添加新方法或属性的机制。它主要用于扩展功能,但重写类方法时,需注意Category的作用范围仅限于当前Category,不会影响到其他类的实例。
2. **#import与#include的区别**:
- `#import`是Objective-C特有的关键字,用于导入头文件,它确保每个文件只被导入一次,避免了多次包含可能带来的重复代码和潜在问题。而`#include`则是C/C++的导入方式。
- `@class`关键字用于声明一个类,允许在头文件中引入类的声明,而推迟到实际使用时加载实现,解决了头文件循环依赖的问题。
- `#import <>`用于导入系统头文件,而`#import ""`用于导入用户自定义的头文件。
3. **属性修饰符的作用**:
- `nonatomic`:默认的修饰符,表示setter和getter方法不是原子操作,适用于单线程环境。如果需要多线程安全,应使用`nonatomic, atomic`。
- `nonatomic, retain`:属性为指针类型时,setter方法会保留传入的对象,并将其赋值给实例变量,增加了对象的引用计数。
- `nonatomic, copy`:属性为对象类型时,setter方法会创建一个新对象的副本并赋值,原始对象不受影响。
- `nonatomic, readonly`:只读属性,只提供getter方法,不允许外部直接修改。
- `nonatomic, assign`:属性为指针类型时,setter方法简单地将传入参数赋值给实例变量,不涉及对象的生命周期管理。
4. **setter方法示例**:
- 对于`@property (nonatomic, retain) NSString *name`,setter方法实现如下:
```objective-c
-(void)setName:(NSString *)str {
[str retain]; // 保留新值
[name release]; // 释放旧值
name = str; // 将新值赋给实例变量
}
```
- 对于`@property (nonatomic, copy) NSString *name`,setter方法则稍有不同:
```objective-c
-(void)setName:(NSString *)str {
name = [str copy]; // 创建新字符串的副本并赋值
}
```
了解这些知识点,不仅有助于你在iOS面试中表现出扎实的编程基础,而且在日常开发中能更好地管理对象的生命周期和线程安全。