ARC:Automatic Reference Counting
__strong 默认值,只要有强引用指针指向该变量,则该变量会一直存在
__weak 若没有任何强引用指针指向该变量,则自动将变量的值设为空(nil状态)
测试用的类,重写dealloc方法
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property(nonatomic,copy)NSString* name;
@end
#import "Student.h"
@implementation Student
- (void)dealloc{
NSLog(@"释放堆内存__%@",_name);
}
@end
/**
* 测试__strong
*/
void test1(){
Student* stu = [[Student alloc]init];
stu.name = @"lin";
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
test1();
}
return 0;
}
在这里stu变量为__strong修饰,test1执行结束后,stu指针出栈时,如果该指针指向的内存空间没有别的指针指向他,就自动调用dealloc方法释放堆内存,执行结果
Paste_Image.png/**
* 测试__strong
*/
void test2(){
Student* stu = [[Student alloc]init];
stu.name = @"lin";
stu = [[Student alloc]init];//程序执行到这里先释放第一次分配的堆内存,因为stu指针指向了新开辟的堆内存,老的内存已经没有人指向所以释放
stu.name = @"lll";
}
//test2执行结束后,释放第二次分配的堆内存
执行结果
Paste_Image.png/**
* 测试__strong
*/
void test3(){
Student* stu = [[Student alloc]init];
stu.name = @"lll";
stu = nil;//把stu指针nil后,没有指针指向堆内存,堆内存释放
sleep(10);//延时10秒执行,为了演示不是出栈的情况
}
执行结果:
Paste_Image.pngvoid test4(){
Student* stu = [[Student alloc]init];
stu.name = @"lll";
Student* stu2 = stu;
stu2.name = @"lin";
stu = nil;//stu置为空并没有释放内存,因为还有stu2指针指向这块内存
sleep(10);//延时10秒执行,为了演示不是出栈的情况
}
执行结果:
Paste_Image.pngvoid test5(){
Student* stu = [[Student alloc]init];
stu.name = @"lll";
__weak Student* stu2 = stu;
stu2.name = @"lin";
stu = nil;//stu置为空,立即释放内存,以为stu2是weak修饰的,一旦没有强指针(这里为stu指针)指向内存,立即释放
sleep(10);//延时10秒执行,为了演示不是出栈的情况
NSLog(@"test5即将执行完毕");
}
执行结果:
Paste_Image.png注意查看控制台打印的时间。
以上就是对 strong weak 略微理解
下面推荐几篇别人总结的东东,写得真的很好
ARC下需要注意的内存管理
iOS/OS X内存管理(一):基本概念与原理
iOS/OS X内存管理(二):借助工具解决内存问题
网友评论