📜  Obj-C内存管理(1)

📅  最后修改于: 2023-12-03 15:18:05.213000             🧑  作者: Mango

Obj-C内存管理

Obj-C是一门动态语言,其内存管理机制与其他静态语言有很大的不同。本文将为程序员介绍Obj-C的内存管理机制,其中包括:

  • ARC与MRC
  • Obj-C的内存模型
  • 内存管理的5个关键字:retainreleaseautoreleasedeallocretainCount
  • 内存管理的规则
ARC与MRC

MRC(Manual Reference Counting)和ARC(Automatic Reference Counting)是Obj-C中两种不同的内存管理机制。在MRC中,程序员需要手动管理内存,手动增加和减少对象的引用计数;在ARC中,编译器将自动插入内存管理代码,程序员不需要手动管理。

ARC已经成为了Obj-C的主流内存管理机制,大多数新的Obj-C代码都使用ARC。但是,在某些情况下,MRC仍然是必须的,例如在iOS开发中使用非ARC的第三方库。

Obj-C的内存模型

在Obj-C中,每个对象都有一个retain count(引用计数),用于追踪对象被引用的次数。当一个对象的引用计数为0时,该对象会被销毁。

Obj-C中的内存管理是基于引用计数的,程序员需要手动增加和减少对象的引用计数,以保证对象在不需要时能够被正确释放。

内存管理的5个关键字
retain

retain用于增加对象的引用计数。要避免引用计数过高,造成内存泄漏。

NSString *str = [[NSString alloc] init];
[str retain];
release

release用于减少对象的引用计数。当对象的引用计数减少到0时,该对象会被销毁。

NSString *str = [[NSString alloc] init];
[str retain];
[str release];
autorelease

autorelease用于将对象添加到一个autoreleasepool中,延迟对象的释放时间,直到autoreleasepool被释放时,其中的对象才会被释放。使用autorelease可以避免内存泄漏。

NSString *str = [[NSString alloc] init];
[str autorelease];
dealloc

dealloc是一个对象的析构函数,用于释放对象的资源,通常在其中调用[super dealloc]来释放父类中的资源。

- (void)dealloc {
    [super dealloc];
}
retainCount

retainCount用于获取对象的引用计数。

NSString *str = [[NSString alloc] init];
NSLog(@"%ld", [str retainCount]);
内存管理的规则

在Obj-C中,有一些基本规则需要遵守,以保证内存管理的正确性。

  1. 对一个对象进行alloccopynewretain等操作后,需要在不需要该对象时释放它。

  2. 当一个对象被丢弃时,需要将其引用计数减少为0,并销毁对象。

  3. 不要在对象的dealloc方法中调用self的实例变量。

  4. 当一个对象被释放时,需要将其所有IBOutlet属性设置为nil

  5. 避免使用retainCount来判断对象的生命周期。

遵循以上规则,可以有效地避免内存管理问题。