ARC下的内存管理

本文讨论一下ARC(Automatic Referencing Count)下的内存管理问题

属性和实例变量的区别?

实例变量是类的私有成员变量,无法被外部访问,并且子类无法继承。
属性以@property修饰,是封装了getter/setter方法的“成员变量”,可以被外部访问和被继承。声明属性后,系统会生成一个名为_property的变量。
在.m中可以使用self.property 或者_property读写属性,两者的区别是:前者会调用系统/自定义的getter/setter方法,后者只是对_property的操作。

注意:
正因为_property = object;这样的操作并不会掉用setter方法,所以如果属性property被定义为copy,而且object又实现了深拷贝时,就无法实现深拷贝的效果。例如:

.h中定义:
@property (nonatomic, copy) NSString *strCopy;

.m中实现:
NSMutableString *string = [NSMutableString stringWithFormat:@”abc”];
_strCopy = string;
if (_strCopy == string)
{
NSLog(@”This is a shallow copy”);
}
else
{
NSLog(@”This is a deep copy”);
}

self.strCopy = string;
if (_strCopy == string)
{
NSLog(@”This is a shallow copy”);
}
else
{
NSLog(@”This is a deep copy”);
}

输出结果是:
2016-11-09 13:43:02.389 test[3995:380720] This is a shallow copy
2016-11-09 13:43:02.390 test[3995:380720] This is a deep copy

声明属性时,strong 和 copy的区别?

一句话说明:用strong修饰属性,只是属性的引用计数加1,copy修饰属性的话,会在setter函数中掉用该属性对象的copy方法。像集合类型:NSArray, NSSet的copy方法,只是指针赋值的浅拷贝。非集合类型

Tables集合类(数组、集合)非集合类
操作不可变对象浅拷贝浅拷贝
操作可变对象深拷贝深拷贝

集合类:array,set
不可变对象:NSArary NSSet
可变对象:NSMutableArray, NSMutableSet

例如:NSString,是非集合类不可变对象,是浅拷贝。

属性的其它修饰符: assign, weak

assign : 直接赋值,一般来修饰基本数据类型。
weak : 修饰ObjC对象,set时不保留新值,也不释放旧值,只设置新值。

assign与weak的不同是assign使用后并没有将指针赋值为nil,可能出现野指针(如何出现?)
weak会将指针赋值为nil。

block的内存管理

OC中有三种类型的block

非ARC中的block类型有:
1,_NSConcreteGlobalBlock 全局的静态 block,不会访问任何外部变量。
2,_NSConcreteStackBlock 保存在栈中的 block,当函数返回时会被销毁。
3,_NSConcreteMallocBlock 保存在堆中的 block,当引用计数为 0 时会被销毁。
ARC中只有1,3两种。

block用什么内存属性修饰

我们需要防止下面这种情况:由于内存属性设置不当,导致block变量成为野指针,然后执行block时,会出现崩溃。
例如将block的属性设置成为assign,会导致这种情况的发生。
结论:
在非ARC中,需要用copy修饰,将block创建到堆上面。
在ARC中,用retain或者copy修饰都可以,但是会提示用copy修饰的warning。
如图所示:

block使用的另外两个注意点

1,由于block会对内部的变量进行强引用,所以在block内部对于增加引用计数的外部变量需要使用其__weak版本。
2,关于block内部对外部变量的访问方式。对于外部变量的访问方式通常是只读方式,只有增加了__block修饰的外部变量才可修改。

property的属性和默认属性

1, readwrite/readonly
2,assign/retain/strong/copy/weak
3,atomic/nonatomic

参考:
1,http://www.cocoachina.com/ios/20160411/15892.html
2,block内部实现原理(一) http://www.cnblogs.com/yoon/p/4953618.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值