zoukankan      html  css  js  c++  java
  • [笔记]Cocoa训练营内存管理篇

    版权说明:讲解语言细节,揉杂了各种经典书籍的代码,正确性是额可肯定的,不喜勿喷。代码全部在Xcode4.4亲手编译。

    备注:看此文者请具备C/C++ 学习背景,相信大学都教了吧,最好具有编程经验。本人易拾人牙慧,希望能给诸位些许帮助。

    OC即object c一下均用OC表达。

    [IOS/C/C++程序员必须学会内存管理,创建对象和销毁对象,必须成对出现。]

    [内存管理不善,造成内存泄漏,会粗大事,骚年们]

    1.对象的创建

    在C/C++ 中,我们通过new等关键字开辟内存控件,并且进行初始化。(有经验的C++程序员不会使用new关键字创建对象,请看下文)。

    我们以前在C++中通过new关键字创建对象的时候,其实同时完成了初始化。很多时候,我们并不希望得到这个结果,于是熟练的程序员会使用其他的方法。

    关于C++ 的知识请看 《C++ 程序设计语言》或者《C++ PRIMER》都有很详细的语法说明,关于C++的知识我就不再赘述了。

    1 NSString *str=[[NSString alloc]initWithFormat:@"hello"];

    完整代码:

    1 int main(int argc, const char * argv[])
    2 {
    3    
    4     NSString *str=[[NSString alloc]initWithFormat:@"hello"];
    5     NSLog(@"str = %@",str);
    6     return 0;
    7 }

    输出结果:

    2012-08-05 15:02:16.960 testDemo[1698:303] str = hello

     

    小提示:

    alloc关键字负责开辟内存空间,initWithForamt格式化了一个字符串对str进行了初始化。init初始化具有很多重载方法,就不一一细表了。

    NSLog类似于printf,输出的时候带有时间戳,在代码调试中,经常会用到,相信大家也知道OC支持C/C++混编。不用printf 的原因是因为NSLog在OC中效率最高。

    OC中使用计数器进行内存管理,采用new alloc 等关键字创建对象,retainCount会加1,对象被引用一次计数器也会加1,retain保持对象,也会是计数器+1.

    使用relese关键字会释放一次对象,计数器减1.当计数器为0的时候,对象销毁。

    现在我们看以下代码关注计数器的变化。

     1 //
     2 //  Car.m
     3 //  testDemo
     4 //
     5 //  Created by YuZai on 12-8-5.
     6 //  Copyright (c) 2012年 YuZai. All rights reserved.
     7 //
     8 
     9 #import "Car.h"
    10 
    11 @implementation Car
    12 -(id)init
    13 {
    14     if (self=[super init]) {
    15         
    16     }
    17     return  self;
    18 }
    19 -(void)dealloc
    20 {
    21     NSLog(@"Car object is dealloc!");
    22     [super dealloc];
    23 }
    24 @end
     1 //
     2 //  main.m
     3 //  testDemo
     4 //
     5 //  Created by YuZai on 12-8-5.
     6 //  Copyright (c) 2012年 YuZai. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 #import "Car.h"
    11 
    12 int main(int argc, const char * argv[])
    13 {
    14     
    15     Car *car=[[Car alloc]init];
    16     NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]);
    17     //保持对象
    18     [car retain];
    19     NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]);
    20     [car release];
    21     NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]);
    22     [car release];
    23     NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]);
    24     
    25     
    26     return 0;
    27 }

    输出结果:

    2012-08-05 15:32:37.815 testDemo[1960:303] car retainCount is 1

    2012-08-05 15:32:37.817 testDemo[1960:303] car retainCount is 2

    2012-08-05 15:32:37.817 testDemo[1960:303] car retainCount is 1

    2012-08-05 15:32:37.818 testDemo[1960:303] Car object is dealloc!

    2012-08-05 15:32:37.818 testDemo[1960:303] car retainCount is 1

     
     
     
    2.创建自动释放对象
    自动释放对象仅在MAC OS开发中使用,在IOS中就不能使用了,貌似最新的IOS5支持自动释放了,但对于一名有志成为优秀程序员的我们,必须得学会自己进行内存管理。
     1 //此方法属于对象
     2 -(Car *)car
     3 {
     4     return [[[Car alloc]init]autorelease];
     5 }
     6 //此方法属于类
     7 +(Car *)car
     8 {
     9         return [[[Car alloc]init]autorelease];
    10 }
     1 //
     2 //  main.m
     3 //  testDemo
     4 //
     5 //  Created by YuZai on 12-8-5.
     6 //  Copyright (c) 2012年 YuZai. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 #import "Car.h"
    11 
    12 int main(int argc, const char * argv[])
    13 {
    14     /**
    15     Car *car=[[Car alloc]init];
    16     NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]);
    17     //保持对象
    18     [car retain];
    19     NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]);
    20     [car release];
    21     NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]);
    22     [car release];
    23     NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]);
    24     **/
    25     for (int i=0; i!=10; i++) {
    26                NSLog(@"when i is %d,car retainCount is %lx",i,(unsigned long)[[Car car]retainCount]);
    27     }
    28     
    29     return 0;
    30 }

    输出结果:

    2012-08-05 15:55:45.349 testDemo[2143:303] when i is 0,car retainCount is 1

    2012-08-05 15:55:45.351 testDemo[2143:303] when i is 1,car retainCount is 1

    2012-08-05 15:55:45.351 testDemo[2143:303] when i is 2,car retainCount is 1

    2012-08-05 15:55:45.352 testDemo[2143:303] when i is 3,car retainCount is 1

    2012-08-05 15:55:45.352 testDemo[2143:303] when i is 4,car retainCount is 1

    2012-08-05 15:55:45.353 testDemo[2143:303] when i is 5,car retainCount is 1

    2012-08-05 15:55:45.353 testDemo[2143:303] when i is 6,car retainCount is 1

    2012-08-05 15:55:45.354 testDemo[2143:303] when i is 7,car retainCount is 1

    2012-08-05 15:55:45.354 testDemo[2143:303] when i is 8,car retainCount is 1

    2012-08-05 15:55:45.355 testDemo[2143:303] when i is 9,car retainCount is 1

     

    代码:                                              

  • 相关阅读:
    Openwrt智能路由系统开发--内容总结
    EdgeX foundry树莓派搭建与MQTT通讯
    C语言学习截图保存
    使用python生成Latex公式语法
    数据结构与算法之排序
    数据结构与算法之常用数据结构
    MySQL数据库规范 (设计规范+开发规范+操作规范)
    动态规划之LIS(最长上升子序列)
    动态规划之区间DP
    动态规划之状态压缩DP
  • 原文地址:https://www.cnblogs.com/tubufeng/p/2623891.html
Copyright © 2011-2022 走看看