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;
}
运行结果:
相信到了这里大家会基本理解内存管理.
|
|