黑马程序员技术交流社区
标题:
二战黑马:autorelease
[打印本页]
作者:
崔石炫
时间:
2014-10-23 23:57
标题:
二战黑马:autorelease
// Person.h
#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
@property(nonatomic , retain) NSString *name;
@property(nonatomic , assign) int age;
@property(nonatomic , retain) Dog *dog;
+ (id)person;
@end
复制代码
// Person.m
#import "Person.h"
#import "Dog.h"
@implementation Person
+ (id)person //快速构造器(便利构造器)
{
return [[[self alloc] init] autorelease];
// * 有alloc , 有release/autorelease
// NSString对象的创建过程没有手动alloc,所以无需release/autorelease
}
- (void)walkDog
{
[_dog run];
}
- (void)dealloc
{
NSLog(@"名为%@的人被回收" , _name);
[_dog release]; //对占用的对象做release操作
[super dealloc];
}
@end
复制代码
// Dog.h
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@property(nonatomic , assign) int age;
+ (id)dog;
- (void)run;
@end
复制代码
// Dog.m
#import "Dog.h"
@implementation Dog
+ (id)dog
{
return [[[self alloc] init] autorelease];
}
- (void)run
{
NSLog(@"跑跑跑");
}
- (void)dealloc
{
NSLog(@"%d岁的狗被回收" , _age);
[super dealloc];
}
@end
复制代码
// main.m
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Person.h"
/*
autorelease
* 延迟release操作的时间
* 不必关心alloc、release操作的顺序
* 快速构造器:快速返回autorelease过的对象
autoreleasepool
* 可以嵌套使用
* 自动释放池被销毁时,对池中所有对象做一次release操作
内存管理原则
* 有alloc , 有release/autorelease
* 有retain , 有release
* 不能重复调用release、autorelease,必须配对使用
*/
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [Person person];
p.age = 15;
p.name = @"张三";
Person *p2 = [Person person];
p2.age = 16;
p2.name = @"李四";
Dog *d = [Dog dog];
d.age = 1;
Dog *d2 = [Dog dog];
d2.age = 2;
p.dog = d;
p.dog = d;
p2.dog = d2;
p2.dog = d2;
p.dog = d2;
p2.dog = d;
} //autoreleasepool被销毁,对池中所有对象做一次release操作
return 0;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2