Objective-C内存管理

Objective-C内存管理

- MRC(Manual Reference Counting人工引用计数)

1. retain、copy、assign、release、autorelease

(1)在MRC中的使用

  • assign就是针对基本数据类型的,赋值就是赋值其他的是针对指针的,通常OC对象都是通过指针来引用
  • [对象 retain]会使对该对象的引用增加一,release相反,减一。
  • [对象 copy]通常会使获得对象的一个副本,并返回这个副本的引用。原对象的引用不变。

(2)作为属性的语义性使用

用copy retain assign来声明类的属性,影响的就是这个类的setter和getter方法的实现。
  • 声明成assign的属性,其setter和getter完成的是简单的赋值和返回值。
  • 声明成copy的属性,其setter方法中对实例变量赋值时,获取的是对象的副本的引用,并且在赋值之前会先把原来引用的对象release掉,以保证不会造成内存泄露。其getter方法中,返回的是[[对象 retain]autorelease]以使得对该对象的引用次数增加一,并且这个次数会在后面自动释放的。
  • 声明成retain的属性,其setter方法中对实例变量赋值时,获取的是对象的引用,因此会使得那个对象的引用次数增加一。当然在此之前要把原来引用的对象release掉,以保证不会造成内存泄露。其getter方法和声明成copy的getter方法是一样的。

由于在声明属性的时候,使用了这几个语义来修饰,也就是说实现了对应的getter和setter方法,因此在程序中通过getter和setter访问对象的时候,不需要再进行内存管理,因为getter和setter方法本身已经实现了内存管理了。

也就是说,属性的内存管理,是由类的setter和getter方法实现的,而类的内存管理,是在调用类的程序中进行的。

2.内存管理原则

alloc、copy、retain三个关键字,见一次就需要对应release一次。没有见到这三个关键字就不需要release。

3. 需要注意

(1)在彻底释放对某个类的对象的引用之前,应该保证已经把这个类里面包含的所有(对象)属性都release掉了。否则就造成内存泄露。
具体做法就是重写dealloc方法,这个方法由系统调用。
通常这个方法默认的样子是这样的:

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

要在最后一句 [super dealloc];之前,把所有的属性release掉,比如:

- (void)dealloc {
     [_name release];

(2)在释放了一个指针指向的空间以后,必须要把这个指针指向nil。

...
[p release];
p = nil;
...

(3)遵守内存管理原则的便利构造器

-(instancetype)personWithName:(NSString *)name{
    return [[Person alloc]initWithName:name]autorelease];
}

这样,在程序中调用便利构造器来新建对象,不需要release。维护了内存管理原则:没有见到copy、alloc或retain就不需要release。

(4)在初始化方法中给属性赋值要使用setter和getter方法
在声明属性的时候,需要指定属性的语义(assign、copy、retain),编译器根据语义为属性自动生成了对应的getter和setter方法,显然这两个方法是实现了内存管理的。在初始化方法中,如果直接给实例变量赋值,而不使用setter方法,(比如给属性name赋值写成_name=@“lily”;),就等于没有对该属性进行内存管理,这可能会造成内存泄露。因此,在初始化方法中,给变量赋值需要使用setter方法,比如name属性,可以用self.name或者[self setName:]都来赋值(点语法本质上也是调用setter和getter方法)。

- ARC(Automatic Reference Counting自动引用计数)

1.assign、strong、copy、weak

ARC是建立在MRC基础上的,ARC就是编译器按照MRC的规则来帮我们完成引用计数工作(按MRC的规则来修改我们的代码)。
我们知道,MRC对属性的引用计数规则包括3种:retain、copy、assign。
在ARC状态下,把属性声明成assign,意思是让编译器以assign的规则来管理这个属性。
相应的,把属性声明成strong,就是让编译器按retain的规则来管理这个属性。
把属性声明成copy,就是让编译器按copy的规则来管理这个属性的引用计数。
而weak,是让告诉编译器不要给这个属性进行引用计数。
在ARC状态下,不允许出现MRC独有的关键字:retain、release、autorelease。 当重写dealloc方法时, 也不能写[super dealloc],否则会报错。

- ARC和MRC的切换和混编

1. 为项目开启或关闭ARC

项目名》TARGETS》Build Settings 》Apple LLVM 7.0 - Language - Objective C》Objective-C Automatic Reference Counting

2. 为项目中某个文件开启或关闭ARC

项目名》TARGETS》Build Phases 》Compile Sources 找到要开启或关闭ARC的那个文件名,为它增加Compiler flags
打开ARC: -fobjc-ac 关闭ARC: -fno-objc-ac

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值