4 3.OC9-内存管理1-retain和release
内存管理
范围:
任何继承了NSObject的对象,对基本数据类型无效。
原理:
1)、每个对象内部保存了一个与之相关联的整数,称为引用计数器
2)、当使用alloc、new或者copy创建一个对象时,对象的引用计数器设置为1
3)、给对象发送一条retain消息,可以使引用计数器值+1
4)、给对象发送一条release消息,可以使引用计数器值-1
5)、当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法。
6)、可以给对象发送retainCount消息获得当前的引用计数器值。
内存管理原则
1)、谁创建,谁释放(“谁污染,谁治理”)。如果你通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用release 或 autorelease。换句话说,不是你创建的,就不用你去释放。
2)、一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
3)、谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。
例一:
main.m
// // main.m // 内存管理retian和release // // Created by qwz on 13-12-9. // Copyright (c) 2013年 renhe. All rights reserved. //
#import <Foundation/Foundation.h> #import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool { Student *stu = [[Student alloc] init]; //1
[stu release]; //0
//[stu release]; //会发生野指针错误,也就是说访问了不属于你的内存 } return 0; }
|
Student.h
// // Student.h // 内存管理retian和release // // Created by qwz on 13-12-9. // Copyright (c) 2013年 renhe. All rights reserved. //
#import <Foundation/Foundation.h>
@interface Student : NSObject
@propertyint age;
@end |
Student.m
// // Student.m // 内存管理retian和release // // Created by qwz on 13-12-9. // Copyright (c) 2013年 renhe. All rights reserved. //
#import "Student.h"
@implementation Student @synthesize age = _age; //在xcode5.0环境下是可以省略的
- (void) dealloc{ NSLog(@"%@被销毁了", self);
[superdealloc]; //一定要调用super的dealloc方法,而且最好要放在最后面调用
} @end |
运行结果:
2013-12-09 11:32:58.451 内存管理retian和release[466:403] <Student: 0x1001144d0>被销毁了 |
----------------
例二:
main.m
// // main.m // 内存管理retian和release // // Created by qwz on 13-12-9. // Copyright (c) 2013年 renhe. All rights reserved. //
#import <Foundation/Foundation.h> #import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool { Student *stu = [[Student alloc] init]; //1
//z代表无符号 NSLog(@"count:%zi", [stu retainCount]);
[stu retain]; //2
NSLog(@"count:%zi", [stu retainCount]);
[stu release]; //1
NSLog(@"count:%zi", [stu retainCount]);
[stu release]; //0
//[stu release]; //会发生野指针错误,也就是说访问了不属于你的内存 } return 0; }
|
Student.h
// // Student.h // 内存管理retian和release // // Created by qwz on 13-12-9. // Copyright (c) 2013年 renhe. All rights reserved. //
#import <Foundation/Foundation.h>
@interface Student : NSObject
@propertyint age;
@end |
Student.m
// // Student.m // 内存管理retian和release // // Created by qwz on 13-12-9. // Copyright (c) 2013年 renhe. All rights reserved. //
#import "Student.h"
@implementation Student @synthesize age = _age; //在xcode5.0环境下是可以省略的
- (void) dealloc{ NSLog(@"%@被销毁了", self);
[superdealloc]; //一定要调用super的dealloc方法,而且最好要放在最后面调用
} @end |
运行结果:
2013-12-09 10:59:09.977 内存管理retian和release[447:403] count:1 2013-12-09 10:59:09.987 内存管理retian和release[447:403] count:2 2013-12-09 10:59:10.002 内存管理retian和release[447:403] count:1 2013-12-09 10:59:10.012 内存管理retian和release[447:403] <Student: 0x1001144d0>被销毁了 |