------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
问题:一个人有一张身份证,一张身份证只对应一个人,那么问题来了,
请用代码描述上述关系,用@property和autorelease方法对内存进行管理。
1>分析请参照 06@property内存管理中如何避免循环引用的问题
2>内存分析请参照 06@property内存管理中如何避免循环引用的问题
3>代码
Person类
Person.h文件
#import <Foundation/Foundation.h>
@class Card;
@interface Person : NSObject
@property (nonatomic, assign) Card *card;
@end
Person.m文件
#import "Person.h"
@implementation Person
- (void)dealloc
{
NSLog(@"Person-----dealloc!");
[super dealloc];
}
@end
Card类
Card.h类
#import <Foundation/Foundation.h>
@class Person;
@interface Card : NSObject
@property (nonatomic, retain) Person *person;
@end
Card.m文件
#import "Card.h"
@implementation Card
- (void)dealloc
{
NSLog(@"Card-----dealloc!");
[_person release];
[super dealloc];
}
@end
main()主函数
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Card.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[[Person alloc] init] autorelease];
Card *c = [[[Card alloc] init] autorelease];
p.card = c;
c.person = p;
// 因为使用了autorelease,不用再手动发送release消息,释放池销毁时会自动发送
// [p release];
// [c release];
}
return 0;
}
运行程序:
autorelease半自动释放池技术总结:
1.autorelease的基本用法
1> 会将对象放到一个自动释放池中
2> 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3> 会返回对象本身
4> 调用完autorelease方法后,对象的计数器不变
2.autorelease的好处
1> 不用再关心对象释放的时间
2> 不用再关心什么时候调用release
3.autorelease的使用注意
1> 占用内存较大的对象不要随便使用autorelease
2> 占用内存较小的对象使用autorelease,没有太大影响
4.错误写法
1> alloc之后调用了autorelease,又调用release
@autoreleasepool
{
// 1
Person *p = [[[Person alloc] init] autorelease];
// 0
[p release];
}
2> 连续调用多次autorelease
@autoreleasepool
{
Person *p = [[[[Person alloc] init] autorelease] autorelease];
}
5.自动释放池
1> 在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)
2> 当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池
6.自动释放池的创建方式
1> iOS 5.0前
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release]; // [pool drain];
2> iOS 5.0 开始
@autoreleasepool
{
}