iOS,ARC下strong weak略解

ARC:Automatic Reference Counting


__strong 默认值,只要有强引用指针指向该变量,则该变量会一直存在

__weak 若没有任何强引用指针指向该变量,则自动将变量的值设为空(nil状态)


测试用的类,重写dealloc方法

#import 

@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.png

void test4(){
    Student* stu = [[Student alloc]init];
    stu.name = @"lll";
    
    Student* stu2 = stu;
    stu2.name = @"lin";
    
    stu = nil;//stu置为空并没有释放内存,因为还有stu2指针指向这块内存
    
    sleep(10);//延时10秒执行,为了演示不是出栈的情况
}

执行结果:

Paste_Image.png

void 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内存管理(二):借助工具解决内存问题

你可能感兴趣的:(iOS,ARC下strong weak略解)