Person.h:
#import
@class Dog;
@interface Person : NSObject
@property(nonatomic,strong) Dog *dog;
@end
Person.m:
#import "Person.h"
#import "Dog.h"
@implementation Person
-(void)dealloc{
NSLog(@"%s",__func__);
}
@end
Dog.h:
#import
@class Person;
@interface Dog : NSObject
//在ARC中,如果保存对象不要用assign,用weak
//assign是专门用于保存基本数据类型的
@property(nonatomic,weak) Person *owner;
@end
Dog.m:
#import "Dog.h"
#import "Person.h"
@implementation Dog
-(void)dealloc{
NSLog(@"%s",__func__);
}
@end
#import
#import "Person.h"
#import "Dog.h"
/*
1,什么是ARC?
>ARC(Automatic Reference Counting)自动引用计数 ,ARC是编译器特性。
>在工程中使用ARC非常简单:只需要像往常那样写代码,不用写retain,release和autorelease而已,因为ARC开启时,编译器就会自动在代码合适的地方的地方插入retain,release和autorelease。
2,ARC的注意点和优点
>注意点:ARC是编译器特性,而不是运行时特性。
>优点:
-完全消除了手动管理内存的烦恼,让程序猿更加专心于app的业务实现
-基本上能够避免内存泄露
-有时还能更加快速,因为编译器害可以执行某一些优化
3,ARC的判断原则
>原则:只要还有一个强指针指向对象,对象就会保存在内存
即没有强指针指向对象,对象就会被自动回收
>强指针:默认所有的指针变量都是强指针,用__strong修饰
eg:__strong Person *person = [[Person alloc]init];
>弱指针:用__weak修饰
eg:__weak Person *person = [[Person alloc]init];
注意:在编程中,别用弱指针保存对象,因为对象在创建的时候,就会被立即销毁
4,如果一个对象需要提前销毁,就让强指针指向nil,对象就会被回收了,可以按照下面编写;
Person *person = [[Person alloc]init];
person = nil;
5,在ARC中,也存在MRC同样的问题:A拥有B对象,B拥有A对象,有强指针指向而不释放对象
*/
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc]init];
Dog *dog = [[Dog alloc]init];
person.dog =dog;
dog.owner = person;
}
return 0;
}
//2015-12-17 15:20:53.651 4,ARC基本概念以及内存管理[2312:239735] -[Person dealloc]
//2015-12-17 15:20:53.652 4,ARC基本概念以及内存管理[2312:239735] -[Dog dealloc]
//Program ended with exit code: 0