main.m
#import "Car.h"
#import "Person.h"
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person * p = [[Person alloc] init];
Car * car = [[Car alloc] init]; //@class 只是objcet
p.car = car;
// [car release];
[p play]; //如果提前release car 依然能用 , 因为是用retain修饰的
car.person = p;
[p release];
[car run]; // 就不能用了,因为是 assign修饰的
/*
那循环引用中的 两个对象 到底该修饰谁为 retain , 谁assign呢?
需要考虑主次关系,本例中,从现实中考虑 人没了,车就动不了,所以 [p release]之后 [car run]就动不了,所以
@property (nonatomic,assign) Person * person
*/
}
return 0;
}
Person.h
#import <Foundation/Foundation.h>
@class Car;
@interface Person : NSObject
@property(nonatomic,retain) Car *car; //不知道类型 所以提示 想要用retain就必须是object type
- (void)play;
@end
Person.m
#import "Car.h"
#import "Person.h"
@implementation Person
- (void)dealloc {
[_car release];
[super dealloc];
NSLog(@"person dealloc");
}
- (void)play
{
NSLog(@"Person is play,%@",_car);
}
@end
Car.h
/*
@class Car;
@interface Person : NSObject
@property(nonatomic,retain) Car *car;
@end
*/
#import <Foundation/Foundation.h>
@class Person;
@interface Car : NSObject
/** person */
@property (nonatomic,assign) Person * person;
- (void)run;
@end
Car.m
#import "Car.h"
#import "Person.h"
@implementation Car
- (void)dealloc {
// [_person release];
[super dealloc];
NSLog(@"car dealloc");
}
- (void)run{
NSLog(@"running %@",_person);
}
@end