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

     

    代码:                                              

  • 相关阅读:
    算法----(1)冒泡排序
    淘宝爬虫
    爬虫_豆瓣电影top250 (正则表达式)
    爬虫_猫眼电影top100(正则表达式)
    Android 简单调用摄像头
    Android 简单天气预报
    思维模型
    This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you
    Android studio preview界面无法预览,报错render problem
    Android studio 3.1.2报错,no target device found
  • 原文地址:https://www.cnblogs.com/tubufeng/p/2623891.html
Copyright © 2011-2022 走看看