黑马程序员技术交流社区
标题:
二战黑马:循环引用、类的提前声明
[打印本页]
作者:
崔石炫
时间:
2014-10-23 23:59
标题:
二战黑马:循环引用、类的提前声明
// Person.h
#import <Foundation/Foundation.h>
@class Dog , Card; //@class关键字提前声明两个类,提高性能
@interface Person : NSObject
@property(nonatomic , retain) Dog *dog;
@property(nonatomic , retain) Card *card;
@end
复制代码
// Person.m
#import "Person.h"
#import "Dog.h" //.m文件中正式import头文件
#import "Card.h"
@implementation Person
- (void)dealloc
{
NSLog(@"Person被回收");
[_dog release]; //retain修饰的属性要进行release操作
[_card release];
[super dealloc];
}
@end
复制代码
// Dog.h
#import <Foundation/Foundation.h>
#import "Person.h"
@class Person;
@interface Dog : NSObject
@property(nonatomic , assign) Person *owner;
@end
复制代码
// Dog.m
#import "Dog.h"
#import "Person.h"
@implementation Dog
- (void)dealloc
{
NSLog(@"Dog被回收"); //assign修饰的_owner不需要进行release操作
[super dealloc];
}
@end
复制代码
// Card.h
#import <Foundation/Foundation.h>
#import "Person.h"
@class Person;
@interface Card : NSObject
@property(nonatomic , assign) Person *owner;
@end
复制代码
// Card.m
#import "Card.h"
#import "Person.h"
@implementation Card
- (void)dealloc
{
NSLog(@"Card被回收"); //assign修饰的_owner不需要进行release操作
[super dealloc];
}
@end
复制代码
// main.m
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Card.h"
#import "Person.h"
/*
类的循环引用:你中有我,我中有你
* 要使用@class在.h文件中提前声明所应用的类,然后在.m中#import头文件
*解决办法:一端用retain,另一端用assign
*/
int main(int argc, const char * argv[])
{
Person *p1 = [[Person alloc] init];
Person *p2 = [[Person alloc] init];
Dog *d1 = [[Dog alloc] init];
Dog *d2 = [[Dog alloc] init];
Card *c1 = [[Card alloc] init];
Card *c2 = [[Card alloc] init];
p1.dog = d1;
d1.owner = p1;
p1.card = c1;
c1.owner = p1;
p2.dog = d2;
d2.owner = p2;
p2.card = c2;
c2.owner = p2;
//两个人交换dog 和 card
p1.dog = d2;
d2.owner = p1;
p1.card = c2;
c2.owner = p1;
p2.dog = d1;
d1.owner = p2;
p2.card = c1;
c1.owner = p2;
[p1 release];
[p2 release];
[d1 release];
[d2 release];
[c1 release];
[c2 release];
return 0;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2