[笔记]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

 

代码:                                              

原文地址:https://www.cnblogs.com/tubufeng/p/2623891.html