-fobjc-arc:如果项目是非ARC模式,则需要为ARC模式的代码文件添加-fobjc-arc
-fno-objc-arc:如果项目是ARC模式,则需为非ARC模式的代码文件添加-fno-objc-arc
ARC(Automatic Reference Counting):内存自动回收
- (void)dealloc
{
NSLog(@"person dealloc");
//在ARC中,不能调用[super dealloc];可以重写dealloc
//[super dealloc];
}
与内存管理相关的方法都不能调用(retain,retainCount,release)
判断对象是否被释放:当对象没有强指针引用的话就会被释放
强指针:创建的对象默认就是强指针 __strong
弱指针:__weak
当两个对象的两个指针相互引用时,会出现内存无法释放的问题,这时需要将两个对象的属性,一端用strong,一端用weak或assign
例:
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Card : NSObject
@property(nonatomic,weak)Person *person;//一个类里用strong,另一个用assign或weak
@end
#import <Foundation/Foundation.h>
@class Card;
@interface Person : NSObject
//@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)Card *card;
@end
非ARC(MRC:Mannul Reference Counting):手动管理内存
retain:当变量为指针类型的时候,需要retain修饰,使用setter方法(赋值)的时候,引用计数加1
assign:修饰非指针变量和id类型变量,如NSInteger,CGFloat或delegate
当两个对象的两个指针相互引用时,会出现内存无法释放的问题,这时需要将两个对象的属性,一端用strong,一端用assign
与内存管理有关的方法
1)alloc:引用计数器自动设为1
2)retain:引用计数器+1,返回经过+1后的当前实例对象
3)release:引用计数器-1,并不一定是释放
4)retainCount:获取引用计数器的值
5)dealloc:当实例对象被销毁之前,系统自动调用。注:一定要调用[super dealloc]!!!
与内存管理相关的名词:
1)僵尸对象:此对象被销毁,不能再使用,不能给它发送任何消息
2)野指针:指向僵尸对象(不可用的内存)的指针,给野指针发送消息将会发生不可控的后果。
3)空指针:没有指向任何对象的指针,给空指针发送消息不会产生任何行为
内存管理原则:
1.如果想持有某个对象,就必须负责让做一次retain操作,引用计数器+1
2.如果想放弃某个对象的持有权,就必须让其做一次release操作,引用计数器-1
3.谁retain,谁release