内存管理中有一个循环引用的问题出现,虽然代码看似没有任何内存问题,但是由于互相引用,而造成了内存泄露。没能正确的回收内存。
所以解决的办法是在一个完成的循环体内其中一个对象中,让其不加入内存管理代码,来破坏相互引用的问题。
在循环引用中,需要用到@class 来告诉编译器有这个类,不要再用#import,防止循环导入
#import <Foundation/Foundation.h>//------main
#import "LSPerson.h"
int main(int argc, const char * argv[]) {
LSPerson *per = [[LSPerson alloc] init];
LSCar *car = [[LSCar alloc] init];
per.car = car; //互相包含,车中有人,人有车
car.person = per; //互相包含,车中有人,人有车
[per release];
[car release]; //必须在一个循环体内,其中一个oc对象内加入assign,让其不加入内存管理代码,这样才能正确回收内存,不然会造成内存泄露的问题
return 0;
}
#import <Foundation/Foundation.h>//------LSPerson.h
#import "LSCar.h"
@interface LSPerson : NSObject
@property (nonatomic,retain) LSCar *car; //车
@end
#import "LSPerson.h"//------LSPerson.m
@implementation LSPerson
-(void)dealloc{
NSLog(@"%s",__func__);
self.car = nil;
[super dealloc];
}
@end
#import <Foundation/Foundation.h>//------LSCar.h
@class LSPerson; //这里的@class是为了防止循环导入的问题,用来告诉编译器有LSPerson类
@interface LSCar : NSObject
//@property (nonatomic,retain) LSPerson *person; 如果写会循环引用,造成内存泄露
@property (nonatomic,assign) LSPerson *person;// 必须在循环体内某个对象写assign
@end
#import "LSCar.h"//------LSCar.m
#import "LSPerson.h"//这里需要导入头文件
@implementation LSCar
-(void)dealloc{
NSLog(@"%s",__func__);
self.person = nil;
[super dealloc];
}
@end