A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhou_xingyu 中级黑马   /  2015-8-4 08:43  /  534 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Autorelease://自动释放

——延时释放对象内存。

对于每一个Runloop, 系统会隐式创建一个Autoreleasepool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。

例子:除了大括号之后,会自动release。



(1)     当创建的对象未来某个时候销毁是,可以使用对象的autorelease。

(2)     对象讲所有管理权交给最近的NSautoreleasePool对象,并由其全权释放。



Autoreleasepool://自动释放池

         对象使用autorelease释放的会放进Autoreleasepool,系统自动释放。


例子:


//
//  People.h
//  Memory
//
//  Created by 5016 on 13-12-4.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface People : NSObject

//成员属性
@property(retain,nonatomic)NSString* name;
@property(assign,nonatomic)NSInteger age;

-(People *)initWithName:(NSString*) name andAge:(NSInteger) age;

+(People *)PeopleWithName:(NSString*) name andAge:(NSInteger) age;

-(void)toString;


@end

//
//  People.m
//  Memory
//
//  Created by 5016 on 13-12-4.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import "People.h"

@implementation People

@synthesize name=_name,age=_age;

-(People *)initWithName:(NSString*) name andAge:(NSInteger) age
{
    if(self = [super init])
    {
        _name = name;
        _age = age;
    }
    return self;
}

//便利构造器
+(People *)PeopleWithName:(NSString*) name andAge:(NSInteger) age
{
    People *person = [[People alloc] initWithName:name andAge:age];
   
    return [person autorelease];//向自动释放池注册
}


-(void)toString
{
    NSLog(@"我的名字是%@,今年%ld岁.",_name,_age);
}

//重写(overwirte)父类方法
-(void)dealloc//用来释放对象的方法,相当于C++里面的析构方法
{
    NSLog(@"这个对象被完全释放");
    self.name = nil;//等价于[_name release]或者[self.name release];
    [super dealloc];
}

@end

//
//  main.m
//  Memory
//
//  Created by 5016 on 13-12-4.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "People.h"

int main(int argc, const char * argv[])
{
     NSLog(@"|-----------使用alloc开辟对象堆内存空间按-----------------|");
    People *person1 = [[People alloc]initWithName:@"DRAGON" andAge:23];//alloc开辟对象 +1
    [person1 toString];
    NSLog(@"person1的引用计数是:%ld",[person1 retainCount]);
    [person1 retain];//+1 = 2
    NSLog(@"person1的引用计数是:%ld",[person1 retainCount]);
    [person1 release];//-1 = 1 ;这里对象已经释放一次,引用计数为1
     NSLog(@"person1的引用计数是:%ld",[person1 retainCount]);
    [person1 release];//-1 = 0 ;这里对象再释放一次,引用计数为1-1,系统自动调用dealloc
    NSLog(@"person1的引用计数是:%ld",[person1 retainCount]);
    //[person1 release];//再调用一次,则是过度释放,会出现异常
   
    NSLog(@"|-----------使用便利构造器-----------------|");
    @autoreleasepool {//使用自动释放池进行释放,因为程序结束后会释放
        People *person = [People PeopleWithName:@"dragon" andAge:20];
        [person toString];//使用便利构造器 不需要使用release
    }

    return 0;
}
运行结果:




相信到了这里大家会基本理解内存管理.

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马