前言
例如,有一个Person类,他有一本书,Book类,它有一个拥有者。。。
#import <Foundation/Foundation.h>
#import “Book.h”
@interface Person : NSObject
@property(nonatomic,strong)Book *book;
@end
#import “Person.h”
@implementation Person
- (void)dealloc
{
NSLog(@“人挂了。。。”);
}
@end
#import <Foundation/Foundation.h>
@class Person;
//两个类互相引用,必须有1方是用@class关键字,如果两边都是#import,就会造成循环引用,无限循环。。。
@interface Book : NSObject
@property(nonatomic,strong)Person *owner;
//OC对象,用strong
@end
#import “Book.h”
#import “Person.h”
//Book.h文件用@class Person;了,所以Book.m文件再引用一下Person.h,不会报错,还能有提示
@implementation Book
– (void)dealloc
{
NSLog(@“书被烧毁了。。。”);
}
@end
#import <Foundation/Foundation.h>
#import “Person.h”
int main()
{
Person *p1 = [Person new];
Book *b1 = [Book new];
}
//这时候,人和书都可以被销毁。。。
一、如果人有1本书,书有1个拥有者,这两句话写进去了呢?
例如:
int main()
{
Person. *p1 = [Person new];
Book *b1 = [Book new];
p1.book = b1;
b1.owner = p1;
}
//这时候,人和书都挂不掉。。。
那写成如下这样呢?
nt main()
{
if(1)
{
Person. *p1 = [Person new];
Book *b1 = [Book new];
p1.book = b1;
b1.owner = p1;
}
}
//让p1和b1提前被销毁呢,但是两个对象都不能被挂掉。。。
二、人和书都挂不掉的原因。。。
1.p1指针,指向1个Person对象,b1指针,指向1个Book对象,Person对象里有一个强指针,book,Book对象里有一个强指针,owner,一切都是那么和谐,直到出现了这句话:p1.book = b1; b1.owner = p1;这时候,_book这个强指针,指向了Book对象,_owner这个强指针,指向了Person对象,if语句结束,p1指针没了,b1指针没了,但是_book强指针,还在,_owner强指针,还在,所以两个对象怎么也挂不掉,这就是ARC机制下的循环引用。。。
2.解决方案:让其中1个先挂,另外一个必然跟着挂吧,怎么让其中1个先挂呢?其中1个就不要用strong了,用weak。。。
例如:Book类这么定义:
#import <Foundation/Foundation.h>
@class Person;
@interface Book : NSObject
@property(nonatomic,weak)Person *owner;
@end
#import “Book.h”
#import “Person.h”
@implementation Book
- (void)dealloc
{
NSLog(@“书被烧毁了。。。”);
}
@end