zoukankan      html  css  js  c++  java
  • OC基础--OC内存管理原则和简单实例

    ARC:

    由于自己的学习视频太早,Xcode是iOS6版本,新建命令行项目后,系统会默认启动ARC机制,全程Automatic Reference Counting,简单的说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。--所以自己在学习内存管理的时候为对象进行retain或者release的时候编译器总会报错。

    必须注意的是:ARC并不是GC(垃圾回收机制),它只是一种代码静态分析(Static Analyzer)工具。

    解决办法:由于版本不一样,解决办法的操作方式也不一样。踏破铁鞋无觅处,终于找到了适合自己的

    按照步骤来,第一步点击项目名称, 第二步点击buid settings,第三步再输入框输入Automatic Reference Counting,在下面会搜索出来第四步,所示,将yes改为no。

    第二步,如果你点的不是buid settings,那么你就搜索不出来任何设置项。     

    复制的时候注意,如果实在不行,可以复制中间的Reference,搜索出来好几个设置项,然后选择第四步所示。

    一、内存管理原则:

      1.只要你调用了alloc、new创建了一个新对象,那么你就有责任做一次release

      2.只要你调用了retain,那么你也有责任做一次release

      3.不能再操作已经被释放的对象,不然会发生野指针错误

      4.在对象被释放之前,才能操作对象

      5.计数器有加就应该有减

    二、开启Xcode野指针调试功能:

      1.点击左上角Stop按钮右边的项目名称

      2.Edit Scheme

      3.Diagnostics

      4.勾选Objective-C的Enable Zoombie Objects

    三、成员变量的内存管理(如果成员变量是对象,才需要管理):

    注意两点:

    1.set方法的管理

    *  release旧的成员变量,retain新的成员变量

    2.delloc方法的管理

    *  release成员变量

    四、代码实例:

    Person.h文件:

     1 //
     2 //  Person.h
     3 //  15-内存管理03-对象之间的内存管理
     4 //
     5 
     6 #import <Foundation/Foundation.h>
     7 #import "Dog.h"
     8 #import "Card.h"
     9 
    10 @interface Person : NSObject
    11 {
    12     Dog *_dog;
    13     Card *_card;
    14     int _age;
    15 }
    16 
    17 - (void) setDog:(Dog *)dog;
    18 - (Dog *) dog;
    19 
    20 - (void) setCard:(Card *)card;
    21 - (Card *) card;
    22 
    23 - (void) setAge:(int)age;
    24 - (int) age;
    25 
    26 @end

    Person.m文件:

     1 //
     2 //  Person.m
     3 //  15-内存管理03-对象之间的内存管理
     4 //
     5 
     6 #import "Person.h"
     7 
     8 @implementation Person
     9 
    10 //_age 成员变量不是对象,所以不用管理
    11 - (int)age
    12 {
    13     return _age;
    14 }
    15 
    16 - (void)setAge:(int)age
    17 {
    18     _age = age;
    19 }
    20 
    21 //set方法的管理
    22 //release旧的成员变量,retain新的成员变量
    23 - (void)setCard:(Card *)card
    24 {
    25     if (card != _card)//判断是否为旧的成员变量
    26     {
    27        [_card release];
    28        _card = [card retain];
    29     }
    30 }
    31 
    32 - (Card *)card
    33 {
    34     return _card;
    35 }
    36 
    37 - (void)setDog:(Dog *)dog
    38 {
    39     if (dog != _dog)
    40     {
    41         [_dog release];
    42         _dog = [dog retain];
    43     }
    44 }
    45 
    46 - (Dog *)dog
    47 {
    48     return _dog;
    49 }
    50 
    51 - (void)dealloc
    52 {
    53     //Person在拥有card对象时,在set方法retain,所以在Person对象释放之前,将由Person的dealloc方法来释放card对象
    54     //"谁污染,谁治理"
    55     [_card release];
    56     [_dog release];
    57     NSLog(@"Person被销毁了");
    58     [super dealloc];
    59 }
    60 @end
  • 相关阅读:
    HTML与用户的交互 表单
    HTML区块元素与网页布局
    css清除浮动
    gulp 配置前端项目打包
    React Ntive 学习手记
    gulp 配置自动化前端开发
    HTML5调用手机相机拍照
    JQuery 1.8.3对IE9兼容问题getAttribute
    gruntJs篇之connect+watch自动刷新
    360安全浏览器浏览模式调整
  • 原文地址:https://www.cnblogs.com/gchlcc/p/5197447.html
Copyright © 2011-2022 走看看