掌握了MRC的程序员,对ARC的熟悉就非常容易。下面是ARC内存管理的基本特点。
1、ARC模式新引入对象变量属性strong与weak的说明。
strong与weak,都是用来修饰对象变量的,但不能修饰基本类型变量。
strong的作用是类似于MRC模式中的retain,weak的作用是类似于MRC模式中的assign。
1-1、对象变量的默认属性是strong,除非是用weak声明过。
1-2、在ARC编译的开发中,当一个对象不再有strong类型的指针指向它的时候,它会被释放,即使还有weak型指针指向它。
1-3、临时变量,和成员变量一样遵守语法1-1和1-2。而且在函数结束的时候会自动重置成nil。
1-4、weak的常用场景:
1-3-1、委托对象delegate。
1-3-2、xib方式的IBOutlet变量。
1-3-3、weak引用通常是用于处理循环引用的问题,如代理及block的使用中,相对会较多的使用到weak。
2、对象变量不必也不能调用retain、release、autorelease函数。
3、dealloc函数不必也不能调用[super dealloc]
4、其他(例如:桥接转换关键字__bridge、__bridge_transfer和__bridge_retained等等):略。
下面这个例子可以帮助大家很好的了解strong与weak的作用。
@interface HsPage : UIView
{
}
@property (nonatomic, strong) UIView *viewPtrA;
@property (nonatomic, strong) UIView *viewPtrB;
@property (nonatomic, weak) UIView *viewPtrC;
@property (nonatomic, weak) UIView *viewPtrD;
@property (nonatomic, weak) UIView *viewPtrE;
@end
@implementation HsPage
- (void)dealloc
{
}
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
//创建视图对象V1.
_viewPtrA = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];//strong
_viewPtrB = _viewPtrA;//strong
_viewPtrC = _viewPtrA;//weak
_viewPtrD = _viewPtrA;//weak
_viewPtrE = _viewPtrA;//weak
//创建视图对象V2.
UIView *tempPtrF = [[UIView alloc] initWithFrame:CGRectMake(0, 20, 100, 20)];//strong //若要提前销毁,则手动将tempPtrF置成nil即可。否则只能等这个函数执行完之后,tempPtrF会自动置成nil。
//创建视图对象V3.
__weak UIView *tempPtrG = [[UIView alloc] initWithFrame:CGRectMake(0, 40, 100, 20)];//weak //使用weak修饰的指针所指向的视图对象V3将会立刻会被销毁。即:此句过后的tempPtrG仍是nil。
NSLog(@"0 - - - - - -\n\ttempPtrF = %@\n\ttempPtrG = %@", tempPtrF, tempPtrG);
NSLog(@"1 - - - - - -\n\t_viewPtrA = %@\n\t_viewPtrB = %@\n\t_viewPtrC = %@\n\t_viewPtrD = %@\n\t_viewPtrE = %@", _viewPtrA, _viewPtrB, _viewPtrC, _viewPtrD, _viewPtrE);
_viewPtrA = nil;//此句过后的视图对象V1仍未销毁,这是因为仍有_viewPtrB强引用它。
NSLog(@"2 - - - - - -\n\t_viewPtrA = %@\n\t_viewPtrB = %@\n\t_viewPtrC = %@\n\t_viewPtrD = %@\n\t_viewPtrE = %@", _viewPtrA, _viewPtrB, _viewPtrC, _viewPtrD, _viewPtrE);
_viewPtrC = nil;//此句过后的视图对象V1仍未销毁,这是因为仍有_viewPtrB强引用它。
NSLog(@"3 - - - - - -\n\t_viewPtrA = %@\n\t_viewPtrB = %@\n\t_viewPtrC = %@\n\t_viewPtrD = %@\n\t_viewPtrE = %@", _viewPtrA, _viewPtrB, _viewPtrC, _viewPtrD, _viewPtrE);
_viewPtrB = nil;//此句过后的视图对象V1会被销毁,这是因为_viewPtrB强引用了其他对象,导致目前没有任何一个强引用它,此时所有弱引用它的指针都会被重置成nil。
NSLog(@"4 - - - - - -\n\t_viewPtrA = %@\n\t_viewPtrB = %@\n\t_viewPtrC = %@\n\t_viewPtrD = %@\n\t_viewPtrE = %@", _viewPtrA, _viewPtrB, _viewPtrC, _viewPtrD, _viewPtrE);
}
return self;
}
@end
//执行语句HsPage *tempPage = [[HsPage alloc] initWithFrame:CGRectZero];之后,控制台输出的日志如下图所示。