学习笔记-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。

 

你可能感兴趣的:(学习笔记-weak strong ARC mrc)