面试题答案
一键面试1. 内存管理机制共存原则
- ARC(自动引用计数)与手动
new/delete
:ARC负责Objective-C对象的内存管理,手动new/delete
负责C++对象的内存管理。两者独立工作,互不干扰。在ARC环境下,Objective-C对象的内存由编译器自动插入引用计数相关代码来管理;而C++对象需要开发者手动调用new
分配内存,调用delete
释放内存。 - ARC与智能指针:智能指针(如
std::unique_ptr
、std::shared_ptr
)为C++对象提供类似ARC的自动内存管理。在混合开发中,可以在ARC环境下使用智能指针管理C++对象,这样C++对象的内存管理也具有自动性,与ARC对Objective-C对象的管理类似,从而减少手动管理的复杂性。
2. 示例代码
假设我们有一个包含Objective-C对象和C++对象的类:
#import <Foundation/Foundation.h>
#include <memory>
class CPPClass {
public:
CPPClass() {
NSLog(@"CPPClass created");
}
~CPPClass() {
NSLog(@"CPPClass destroyed");
}
};
@interface ObjCClass : NSObject {
std::unique_ptr<CPPClass> cppObject;
}
- (instancetype)init;
@end
@implementation ObjCClass
- (instancetype)init {
self = [super init];
if (self) {
cppObject = std::make_unique<CPPClass>();
}
return self;
}
- (void)dealloc {
// 在ARC环境下,这里无需手动释放cppObject,智能指针会自动处理
[super dealloc];
}
@end
在上述代码中:
ObjCClass
是一个Objective-C类,它包含一个std::unique_ptr<CPPClass>
类型的成员变量cppObject
,用于管理C++对象CPPClass
。init
方法中,使用std::make_unique
创建CPPClass
对象,并由cppObject
智能指针管理。- 在
dealloc
方法中,由于使用了智能指针,无需手动释放cppObject
指向的C++对象,智能指针会在ObjCClass
对象销毁时自动释放C++对象,从而避免了内存泄漏。这样就实现了Objective-C的ARC机制与C++智能指针管理的内存共存且不产生内存泄漏。如果使用手动new/delete
,则在init
方法中使用new CPPClass()
分配内存,在dealloc
方法中使用delete cppObject;
释放内存,但这种方式需要开发者更加小心地管理内存,容易出错。