美文网首页将来跳槽用
iOS,ARC下strong weak略解

iOS,ARC下strong weak略解

作者: helloDolin | 来源:发表于2016-01-03 16:56 被阅读233次

    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.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略解

        本文链接:https://www.haomeiwen.com/subject/fshohttx.html