前言
例如,有一个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
总结
结论:在ARC的机制下 ,当两个对象相互引用的时候,如果两边都是用strong,那么就会出现内存泄露,解决方案,很简单,1端使用strong,1端使用weak
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。