• 学习笔记-weak strong ARC mrc


         ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切。

    注意:ARC 是编译器特性(ARC是在编译时插入内存管理代码,不影响运行时效率),而不是 iOS 运行时特性(除了weak指针系统),它也不是类似于其它语言中的垃圾收集器(其他语言的垃圾回收机制发生在运行时,所以会影响运行效率)。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化。

          ARC 的规则非常简单:只要还有一个变量指向对象,对象就会保持在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放。这条规则对于实例变量、synthesize属性、局部变量都是适用的。

     例如 一、 NSString * name1 = @"ningning";
        
          __weak  NSString * name2 = name1;

      这里的name2只是也跟name1一样指向了NSString@"ningning")这个对象,但是他不是这个对象的拥有者,这个对象的引用计数还是1,如果@"ningning"这个对象呗name1释放掉的话,name2的就会立即指向nil(当然了,这是在ARC的情况下,mrc下对应的是assign,name2还是会指向已经被释放的地址空间,产生野指针,导致crash),而不是产生crash。

      二、  __weak NSString *str = [[NSString alloc] initWithFormat:@"1234"];
        
           NSLog(@"%@", str); // 打印出来是"(null)"

    因为str是weak指针,是不持有对象的,所以对象创建出来之后就立马释放掉了。

        weak  :有一个作用就是  防止循环引用,导致内存无法释放。例如delegate模式,controller 里面通过strong指针 self.view拥有一个 tableview,但是tableview的delegate和datasource都是weak指针,指向你的controller。

    //顺便说一下为什么NSString修饰的属性是copy

         举个例子吧,

      @property(nonatomic,retain) NSString * name;//用retain修饰

        NSMutableString * stu = [[NSMutableString alloc]initWithFormat:@"1111"]; 
        self.name = stu;
       
         NSLog(@"%@",_name);//打印的是1111
        
        [stu appendString:@"dddd"];
        
        NSLog(@"%@",self.name);//打印的是1111dddd(原本不能改变的string结果页改变了)

      @property(nonatomic,copy) NSString * name;//用retain修饰

        NSMutableString * stu = [[NSMutableString alloc]initWithFormat:@"1111"]; 
        self.name = stu;
       
         NSLog(@"%@",_name);//打印的是1111
        
        [stu appendString:@"dddd"];
        
        NSLog(@"%@",self.name);//打印的是1111(没有改变)

       也就是说,用copy来修饰string是最安全的,目前为止 就知道这些。。。

    ARC情况下:

    1.ARC只能工作于object-c对象,如果应用了core foundation 或者  malloc()/free()还是要自己手动管理内存的。

    2.不能再使用NSAutoreleasePool对象,ARC提供了@autoreleasepool块来代替它,这样更有效率

    3.不能使用内存存储区 NSZone

    4.声明IBOutlet时,一般使用weak,除了对StoryBoard这样nib中间的顶层对象要用strong

    5.weak 相当于mrc下的assign,strong 相当于mrc下的retain。

  • 相关阅读:
    关于quartusII 错误 Error: Current license file does not support the EP*** device 错误原因总结
    怎样用delphi关闭并重新启动 explorer.exe进程
    SQL创建链接服务器
    C#服务启动以及服务指令
    底部广告弹出
    选项卡
    tab切换
    pagex/y offsetx/y screenx/y clientx/y 用法及区别
    放大镜jQuery效果
    放大镜js实现效果
  • 原文地址:https://www.cnblogs.com/luningning0901/p/4878034.html
Copyright © 2020-2023  润新知