OC语言-ARC与分类
OC语言-ARC与分类
盘盘的灰灰 发表于2年前
OC语言-ARC与分类
  • 发表于 2年前
  • 阅读 5
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

  •  当自动释放池结束的时候.仅仅是对存储在自动释放池中的对象发送1条release消息 而不是销毁对象.

  • 如果在自动释放池中,调用同1个对象的autorelease方法多次.就会将对象存储多次到自动释放池之中.

             在自动释放池结束的时候.会为对象发送多条release消息.那么这个是就会出现僵尸对象错误.

             所以,1个自动释放池之中,只autorelease1次,只将这个对象放1次, 否则就会出现野指针错误.

  • 将对象存储到自动释放池,并不会使对象的引用计数器+1

     所以其好处就是:创建对象将对象存储在自动释放池,就不需要在写个release了.

  •  + (instancetype)person

             {

                return [[[self alloc] init] autorelease];

             }

     

             这样,我们直接调用类方法.就可以得到1个已经被autorelease过的对象.

     

  • 结构体变量分配在栈.OC对象分配在堆.

  • 强指针与弱指针.

        强指针: 默认情况下,我们声明1个指针 这个指针就是1个强指针. 

               我们也可以使用__strong来显示的声明这是1个强指针.     

               Person *p1; 这是1个强指针. 指针默认情况下都是1个强指针.

               __strong Person *p2; 这也是1个强指针.使用__strong来显示的声明强指针.

        弱指针: 使用__weak标识的指针就叫做弱指针.           

        无论是强指针还是弱指针,都是指针,都可以用来存储地址,这1点没有任何区别 。

        都可以通过这个指针访问对象的成员.

        唯一的区别就是在ARC模式下.他们用来作为回收对象的基准.     

        如果1个对象没有任何强类型的指针指向这个对象的时候,对象就会被立即自动释放

  • 演示第1个ARC案例

         int main(int argc, const char * argv[])

            {

                @autoreleasepool

                {

                    Person *p1 = [Person new];//p1是1个强指针.

                    //因为我们说过,每1个指针变量默认情况下都是1个强指针变量.

                    NSLog(@"------");

                }//当执行到这里的时候.p1指针被回收,那么Person对象就没有任何

                //强指针指向它了. 对象就在这被回收.

                return 0;

         }

     

     
  • ARC模式下的对象回收标准

         ARC机制下释放1个对象的标准是: 没有任何强指针指向对象的时候,对象就会被释放.

         如果这个时候有弱指针指向,也会被释放.

    什么情况下叫做对象没有强指针向指向.

         1).  指向对象的强指针被回收.

         2).  指向对象的强指针被赋值为nil

     
  •  在ARC的机制下,@property参数不能使用retain

         因为retain代表生成的setter方法是MRC的标准的内存管理代码.

         而我们在ARC的机制下 不需要这些代码.

         所以,在ARC机制下的setter方法 什么都不需要做.直接赋值就可以了.

     

  • 使用建议.

         1). 在ARC机制下.如果属性的类型是OC对象类型的.绝大多数场景下使用strong

         2). 在ARC机制下.如果属性的类型不是OC对象类型的.使用assign

         3).  strong和weak都是应用在属性的类型是OC对象的时候. 属性的类型不是OC对象的时候就使用assign.

     
  • 在ARC机制下,将MRC下的retain换位strong

         @property(nonatomic,strong)Car *car;

         做的事情:

         1).  生成私有属性.并且这个私有属性是strong

         2).  生成getter setter方法的声明

         3).  生成getter setter方法的声明

              setter的实现:直接赋值.

     
  • 在ARC机制下.当两个对象相互引用的时候.如果两边都使用strong 那么就会先内存泄露.

         解决方案: 1端使用strong 1端使用weak

     
  • MRC与ARC兼容: 使用命令.  -fno-objc-arc

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 31
码字总数 24142
×
盘盘的灰灰
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: