Objective-C语法之内存管理
1、Objective-C内存管理简介:
Objective-C需要自己考虑内存的管理,对于从Java, C#等语言转向Objective-C平台的程序员新手来说,这是个很大的挑战。幸运的是,如果熟悉了Objective-C的内存管理机制,手工管理内存也没有那么可怕。 Objective-C的内存管理介于C/C++和Java C#直接,不像C/C++语言内存管理全部需要程序员一手包办,也不像Java C#语言有那么完备的内存垃圾回收器。(Objective-C 2.0有GC机制,不过不支持IOS)。那他是怎么管理内存的呢?通过引用计数进行管理的。PS:在iOS 5后增加了Automatic Reference Counting(ARC 自动引用计数)特性,这样程序员不需要自己操心管理内存了,ARC和GC不一样,ARC是编译器的行为。ARC后面再讲。不过熟悉Objective-C的内存管理机制是非常必要的。
2、内存管理原理:
Objective-C内存管理模型是基于对象的所有权。如果你拥有这个对象,那么你就有责任去释放它。一个对象可以有多个拥有者。如果这个对象的拥有和为0时,系统将自动释放这个对象。对象的所有权和释放有四个原则:
- 任何你创建的对象你都获得其所有权。(包括 alloc ,new ,copy等关键字获得的对象)
- 通过retain获得对象的所有权
- 如果你不需要一个对象了,你必须释放所有权
- 你不能释放你没有所有权的对象
引用计数(retainCount)是Objective-C对象引用的唯一依据。调用实例管理的release方法后,此属性减1,减到为零时对象的dealloc方法被自动调用,进行内存回收操作,也就是说我们永不该手动调用对象的dealloc方法。
3、示例:环境是在不选择ARC的环境下
新建Person类,使他继承与NSObject,在.m文件中实现dealloc方法:
- - (void) dealloc
- {
- NSLog (@"dealloc called. Bye Bye.");
- [super dealloc];
- }
在引用计数为0时,这个方法就会被调用,证明这个对象被销毁。
创建一个对象,打印它的引用计数
- Person *person = [[Person alloc] init];
- NSLog(@"对象person的retainCount: %d", [person retainCount]);
对象person的retainCount: 1
我们增加1
- Person *person = [[Person alloc] init];
- NSLog(@"对象person的retainCount: %d",[person retainCount] );
- [person retain];
- NSLog(@"对象person的retainCount: %d", [person retainCount]);
打印结果:
对象person的retainCount: 1
对象person的retainCount: 2
和传说的一样,retainCount增加了。可以有在release时,减少到1时就不再减 了
- Person *person = [[Person alloc] init];
- NSLog(@"对象person的retainCount: %d",[person retainCount] );
- [person retain];
- NSLog(@"对象person的retainCount: %d", [person retainCount]);
- [person release];
- [person release];
- NSLog(@"对象person的retainCount: %d", [person retainCount]);
- 2012-07-05 16:05:29.830 ObjectiveCTest[2847:f803] 对象person的retainCount: 1
- 2012-07-05 16:05:29.831 ObjectiveCTest[2847:f803] 对象person的retainCount: 2
- 2012-07-05 16:05:29.831 ObjectiveCTest[2847:f803] dealloc called. Bye Bye.
- 2012-07-05 16:05:29.832 ObjectiveCTest[2847:f803] 对象person的retainCount: 1
相关推荐
86540698 2019-11-19
拉斯厄尔高福 2020-11-04
ThinkInLinux 2020-09-30
ljbhander 2020-08-07
xiaobaichen 2020-07-30
mingrixing 2020-07-28
iammjun 2020-07-07
emlinux 2020-06-22
fenxinzi 2020-06-21
huanmie 2020-06-16
chenzhaoguo 2020-06-08
ThinkingLink 2020-05-29
wangqing 2020-05-19
pointfish 2020-05-08
cleanerxiaoqiang 2020-05-08
qingsongzdq 2020-05-01
zuixin 2020-04-19
NeverAgain 2020-04-17