面试题答案
一键面试通过协议实现多继承效果
- 定义多个协议:在Objective-C中,定义多个不同功能的协议,每个协议声明一组方法。例如:
@protocol ProtocolA <NSObject>
- (void)methodA;
@end
@protocol ProtocolB <NSObject>
- (void)methodB;
@end
- 类遵守多个协议:一个类可以同时遵守多个协议,从而实现类似多继承的效果。该类需要实现协议中声明的方法。
@interface MyClass : NSObject <ProtocolA, ProtocolB>
@end
@implementation MyClass
- (void)methodA {
// 实现methodA的具体逻辑
}
- (void)methodB {
// 实现methodB的具体逻辑
}
@end
这样MyClass
类就拥有了ProtocolA
和ProtocolB
所定义的功能,类似实现了多继承。
内存管理问题及解决方案
- 强引用循环问题:当协议中定义的属性或者方法参数使用了强引用,可能会导致循环引用。例如,协议
ProtocolA
定义了一个属性:
@protocol ProtocolA <NSObject>
@property (nonatomic, strong) id <ProtocolB> objectB;
@end
@protocol ProtocolB <NSObject>
@property (nonatomic, strong) id <ProtocolA> objectA;
@end
如果两个对象分别遵守这两个协议并相互持有,就会产生循环引用。
2. 解决方案:使用弱引用(weak
)来打破循环引用。例如将上述协议中的属性改为弱引用:
@protocol ProtocolA <NSObject>
@property (nonatomic, weak) id <ProtocolB> objectB;
@end
@protocol ProtocolB <NSObject>
@property (nonatomic, weak) id <ProtocolA> objectA;
@end
循环引用导致内存泄漏的排查和修复
- 排查方法:
- ** Instruments工具**:使用Xcode自带的Instruments工具,选择Leaks模板,运行应用程序。Instruments会检测到内存泄漏,并指出可能发生泄漏的对象和代码位置。
- 静态分析:使用Xcode的静态分析功能(Analyze),它可以检查代码中潜在的内存管理问题,包括可能的循环引用。
- 修复方法:
- 检查协议和类的引用关系:检查遵守协议的类之间的引用关系,确认是否存在强引用循环。如果存在,按照上述使用弱引用的方式打破循环。
- 合理管理对象生命周期:确保对象在不再需要时能够正确释放。例如,在对象的
dealloc
方法中检查是否有未释放的资源,并进行清理。