- 内存管理机制与方法
- 引用计数机制:
- 在Objective - C中,NSObject类采用引用计数(Reference Counting)来管理对象的内存。每个对象都有一个引用计数,当对象的引用计数变为0时,对象的内存就会被释放。
- 相关方法:
retain
:增加对象的引用计数。例如,当一个对象被传递给另一个对象作为属性或局部变量时,通常会调用retain
方法。
release
:减少对象的引用计数。当一个对象不再需要时,调用release
方法。
autorelease
:向对象发送autorelease
消息,会将对象添加到自动释放池(Autorelease Pool)中,在自动释放池被释放时,池中的对象会收到release
消息。
- 内存管理方法:
init
系列方法:用于初始化对象。在子类中重写init
方法时,通常需要先调用父类的init
方法进行初始化。例如:
- (instancetype)init {
self = [super init];
if (self) {
// 子类的初始化代码
}
return self;
}
- `dealloc`方法:当对象的引用计数变为0时,系统会调用对象的`dealloc`方法来释放对象占用的资源。在子类中重写`dealloc`方法时,必须在最后调用父类的`dealloc`方法。例如:
- (void)dealloc {
// 释放子类中分配的资源
[super dealloc];
}
- 在继承体系中管理对象生命周期
- 初始化过程:
- 子类在初始化时,先调用父类的
init
方法进行初始化,确保父类部分的对象状态正确。例如:
@interface SubClass : NSObject
@property (nonatomic, strong) NSString *subProperty;
@end
@implementation SubClass
- (instancetype)init {
self = [super init];
if (self) {
_subProperty = [[NSString alloc] initWithString:@"Initial value"];
}
return self;
}
@end
- 析构过程:
- 在
dealloc
方法中,先释放子类自己分配的资源,然后调用父类的dealloc
方法。例如:
@implementation SubClass
- (void)dealloc {
[_subProperty release];
[super dealloc];
}
@end
- 使用自动释放池:
- 在需要临时创建大量对象的场景中,可以使用自动释放池。例如:
- (void)createManyObjects {
@autoreleasepool {
for (int i = 0; i < 1000; i++) {
NSString *tempString = [[NSString alloc] initWithFormat:@"Object %d", i];
// 使用tempString
[tempString autorelease];
}
}
}
- 属性的内存管理:
- 当定义属性时,要根据属性的特点选择合适的内存管理策略。例如,对于强引用类型(如
strong
或retain
),属性持有对象的所有权,会增加对象的引用计数;对于弱引用类型(如weak
),属性不持有对象的所有权,不会影响对象的引用计数。
@property (nonatomic, strong) NSArray *strongArray;
@property (nonatomic, weak) id weakObject;
- 对象传递与内存管理:
- 当一个对象作为参数传递给另一个方法时,接收方需要根据实际情况决定是否需要
retain
该对象。例如:
- (void)receiveObject:(id)obj {
self.someProperty = obj; // 如果someProperty是strong属性,会自动retain obj
}