iOS学习——第五天练习

来源:互联网 发布:建筑长宽数据 编辑:程序博客网 时间:2024/05/22 14:20

内存管理


1.大纲


1.1掌握自动释放池的工作机制

1.2掌握使用引用计数管理内存


2.试验目标


2.1掌握对象的所有权和引用计数

2.2自动释放池的概念

2.3掌握内存管理的规则


3.试验方式


  要求学生自己对立完成


4.上机指导任务


4.1任务1:对象所有权和引用计数(时间:60分钟)

  

4.1.1任务描述:


        请自行编写一程序,建立一个NSMutableString对象从allocinitretainreleaseretain,到autorelease阶段显示出每个信息传送后,retaincount的变化情况,并解释它们的原由。


 4.1.2任务目的


       熟练掌握对象所有权、引用计数。

        熟练掌握allocinitretainreleaseretain,到autorelease等。


4.1.3任务要求


        逐步分析allocinitretainreleaseretain,到autoreleaseretainCount的显示。


4.1.4难点提示


         alloc retain 使 retainCount1,releaseautorelease 则-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 allocinit];

ClassA obj2

obj2  obj1 retain];

obj1 hello];

obj1  release];

obj2 hello];

obj2  release];


4.3.2任务目的


熟练掌握内存管理。


4.3.3任务要求


掌握alloccopyretainrelease等在内存中的作用。

理解对象引用计数的概念及用法。


4.3.4难点提示


使用alloc  copyretain 分配内存时,引用计数+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=[[NSMutableStringalloc] init];

   //4.1

   NSLog(@"str %d",[strretainCount]);

    [str retain];

   NSLog(@"str %d",[strretainCount]);

    [str release];

   NSLog(@"str %d",[strretainCount]);

    [str release];

   NSLog(@"str %d",[strretainCount]);

    

   NSMutableString *str1=[[[NSMutableStringalloc] init]autorelease] ;

   NSLog(@"str %d",[str1retainCount]);

   //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 = [obj1retain];//obj1的赋给obj2,两个指向同一个地址,retainCount的值相同

   NSLog(@"obj1-%d obj2-%d",[obj1retainCount],[obj2 retainCount]);

    [obj1hello];//只是调用方法,方法存在代码区,不会改变retainCount

   NSLog(@"obj1-%d obj2-%d",[obj1retainCount],[obj2 retainCount]);

    [obj1release];//obj1obj2指向同一地址,release obj1的同时也会使obj2releaseCount1

   NSLog(@"obj1-%d obj2-%d",[obj1retainCount],[obj2 retainCount]);

    [obj2 hello];

   NSLog(@"obj1-%d obj2-%d",[obj1retainCount],[obj2 retainCount]);

  // [obj2 release];//obj2obj1指向同一地址,不能release同一地址两次,会crush

   //NSLog(@"obj1-%d obj2-%d",[obj1 retainCount],[obj2 retainCount]);

   return YES;

}

原创粉丝点击