内存管理
1.大纲
1.1掌握自动释放池的工作机制
1.2掌握使用引用计数管理内存
2. 试验目标
2.1掌握对象的所有权和引用计数
2.2自动释放池的概念
2.3掌握内存管理的规则
3.试验方式
要求学生自己对立完成
4.上机指导任务
4.1任务1:对象所有权和引用计数 (时间:60分钟)
4.1.1任务描述:
请自行编写一程序,建立一个NSMutableString对象从alloc、init、retain、release、retain,到autorelease 阶段显示出每个信息传送后,retaincount的变化情况,并解释它们的原由。
4.1.2任务目的
熟练掌握对象所有权、引用计数。
熟练掌握alloc、init、retain、release、retain,到autorelease等。
4.1.3任务要求
逐步分析alloc、init、retain、release、retain,到autorelease后retainCount的显示。
4.1.4难点提示
alloc 和 retain 使 retainCount+1,release 和autorelease 则-1。
4.2任务2:引用计数 (时间:30分钟)
4.2.1任务描述
一下每行代码执行后,person对象的retainCount是多少
Person *person = [[Person alloc] init];
[person retain];
[person release];
[person release];
4.2.2任务目的
熟练掌握引用计数。
4.2.3任务要求
依照题意编写程序,然后运行程序并查看运行结果。
4.3任务3:内存管理 (时间:30分钟)
4.3.1任务描述
阅读下面代码,分析程序中对象的引用计数是多少?
ClassA *obj1 = [[ClassA alloc]init];
ClassA *obj2;
obj2 = [obj1 retain];
[obj1 hello];
[obj1 release];
[obj2 hello];
[obj2 release];
4.3.2任务目的
熟练掌握内存管理。
4.3.3任务要求
掌握alloc、copy、retain、release等在内存中的作用。
理解对象引用计数的概念及用法。
4.3.4难点提示
使用alloc copy 和retain 分配内存时,引用计数+1,其余方法不影响引用计数,release是引用计数-1;
代码:
//A.h
#import <Foundation/Foundation.h>
@interface A : NSObject
-(void)hello;
@end
//A.m
#import "A.h"
@implementation A
-(void)hello
{
}
@end
//person.h person.m 无内容
//AppDelegate.m
#import "AppDelegate.h"
#import "Person.h"
#import "A.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
NSMutableString *str=[[NSMutableString alloc] init];
//4.1
NSLog(@"str %d",[str retainCount]);
[str retain];
NSLog(@"str %d",[str retainCount]);
[str release];
NSLog(@"str %d",[str retainCount]);
[str release];
NSLog(@"str %d",[str retainCount]);
NSMutableString *str1=[[[NSMutableString alloc] init]autorelease] ;
NSLog(@"str %d",[str1 retainCount]);
//4.2
Person *person = [[Person alloc] init];
NSLog(@"person %d",[person retainCount]);
[person retain];
NSLog(@"person %d",[person retainCount]);
[person release];
NSLog(@"person %d",[person retainCount]);
// [person release];//不能release同一地址两次,会crush
//NSLog(@"person %d",[person retainCount]);
//4.3
A *obj1 = [ [A alloc]init];
A *obj2;
// NSLog(@"obj1-%d obj2-%d",[obj1 retainCount],[obj2 retainCount]);
obj2 = [obj1 retain];//obj1的赋给obj2,两个指向同一个地址,retainCount的值相同
NSLog(@"obj1-%d obj2-%d",[obj1 retainCount],[obj2 retainCount]);
[obj1 hello];//只是调用方法,方法存在代码区,不会改变retainCount
NSLog(@"obj1-%d obj2-%d",[obj1 retainCount],[obj2 retainCount]);
[obj1 release];//obj1和obj2指向同一地址,release obj1的同时也会使obj2的releaseCount减1
NSLog(@"obj1-%d obj2-%d",[obj1 retainCount],[obj2 retainCount]);
[obj2 hello];
NSLog(@"obj1-%d obj2-%d",[obj1 retainCount],[obj2 retainCount]);
// [obj2 release];//obj2和obj1指向同一地址,不能release同一地址两次,会crush
//NSLog(@"obj1-%d obj2-%d",[obj1 retainCount],[obj2 retainCount]);
return YES;
}