zoukankan      html  css  js  c++  java
  • iOS ARC机制

     iOS提供了ARC功能,很大程度上简化了内存管理的代码。

    1、ARC的本质:

    采用ARC后,iOS开发者完全可以抛弃之前繁琐的内存管理机制。在开启ARC的情况下,编译器会自动的在程序的正确位置隐式的插入retain,release和autorelease等。特别明确,ARC只是objective-C编译器的特征,所有ARC相关处理都会发生在构建应用程序的时候,这和内存垃圾回收机制不同。

    2、基本的ARC使用规则

    1)代码中不能使用retain,release,autorelease等;

    2)不能在C语言结构体中使用对象指针;

    3)不能重载dealloc,如果是释放对象内存以处外的处理,是可以重载该函数,但是不能调用[super dealloc];

    4)不能使用NSAutoReleasePool、而是要使用@autoreleasepool块

    3、ARC机制下的@property规则

    strong:该属性值对应__strong关键字,即该属性所声明的变量将成为对象的持有者。

    weak:该属性对应__weak关键字,该属性所声明的变量将没有对象的所有权,并且当对象被抛弃之后,对象将被自动复制nil;

    copy:与strong的区别是声明变量拷贝的是对象的持有者。

    转自特酷吧:http://www.tekuba.net/program/279/

    但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露。

    一,循环参照

    A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。

    这种问题常发生于把delegate声明为strong属性了

    1 @interface SampleViewController
    2 @property (nonatomic, strong) SampleClass *sampleClass;
    3 @end
    4 
    5 @interface SampleClass
    6 @property (nonatomic, strong) SampleViewController *delegate;
    7 @end

    上例中,解决办法是把SampleClass 的delegate属性的strong改为assing即可。

    二,死循环

    如果某个ViewController中有无限循环,也会导致即使ViewController对应的view关掉了,ViewController也不能被释放。

    这种问题常发生于animation处理。

    1 CATransition *transition = [CATransition animation];
    2 transition.duration = 0.5;
    3 tansition.repeatCount = HUGE_VALL;
    4 [self.view.layer addAnimation:transition forKey:"myAnimation"];

    上例中,animation重复次数设成HUGE_VALL,一个很大的数值,基本上等于无限循环了。

    解决办法是,在ViewController关掉的时候,停止这个animation。

    -(void)viewWillDisappear:(BOOL)animated {
        [self.view.layer removeAllAnimations];
    }

     

  • 相关阅读:
    android笔记:ListView及ArrayAdapter
    android示例:一个简单的登陆程序
    Android笔记:RelativeLayout
    Android笔记:ContextMenu
    java swing示例
    java多线程与并发笔记
    java常用代码
    java学习笔记整理
    Android笔记:intent
    Android笔记:Button
  • 原文地址:https://www.cnblogs.com/tz8023dm/p/4493380.html
Copyright © 2011-2022 走看看