------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
问题:一个人有一张身份证,一张身份证只对应一个人。那么问题来了,
请用代码描述以上关系,并使用@property相关参数对内存进行管理,并避免循环引用。
1>分析:
有2个类:Person类(属性:身份证)、Card类(属性:人)
2>内存分析:
3>代码
按照我们正常的思路写的话:
Person类:
Person.h文件
#import <Foundation/Foundation.h>
@class Card;
@interface Person : NSObject
@property (nonatomic, retain) Card *card;
@end
Person.m文件
#import "Person.h"
@implementation Person
- (void)dealloc
{
NSLog(@"Person-----dealloc!");
[_card release];
[super dealloc];
}
@end
Card类
#import <Foundation/Foundation.h>
@class Person;
Card.h文件
@interface Card : NSObject
@property (nonatomic, retain) Person *person;
@end
Card.m文件
#import "Card.h"
@implementation Card
- (void)dealloc
{
NSLog(@"Card-----dealloc!");
[_person alloc];
[super dealloc];
}
@end
main()主函数
main.m文件
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Card.h"
int main(int argc, const char * argv[]) {
Person *p = [[Person alloc] init];
Card *c = [[Card alloc] init];
p.card = c;
c.person = p;
[p dealloc];
[c dealloc];
return 0;
}
运行程序:
我们发现dealloc方法并没有被调用,说明Person对象和Card对象在互相retain,掐着彼此都不能释放,那么如何解决呢?
将双方中的任何一方的retain参数改为assign参数,即可,这里我修改Person文件中的参数retain。
而Card.h中的retain不变,也就是:
- @property (nonatomic,assign)Card *card;
- @property (nonatomic,retain)Person *person;
当然,retain修改为assign之后,Person类中dealloc方法也应该进行修改,将之前的[_card release]删掉;
修改后,运行程序: