本文讨论一下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