ARC automatic Reference Counting 自动引用计数
ARC的自动释放池进行内存的管理比MRC要简单许多,编译器会帮程序员在适当的时候自动添加内存的管理代码。
那么ARC中是通过什么来确认对象是否需要释放?
ARC中是判断对象是否被强指针指向,来进行判断的。
*******也有例外,在ARC中也有自动释放池,什么时候使用呢?*********
*******只要是通过简洁的构造方法,或者是普通方法返回的对象都放在自动释放池中:比如类方法*****
#import <Foundation/Foundation.h>//------main
#import "LSCat.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
{ //只要是通过简洁的构造方法,或者是普通方法返回的对象都放在自动释放池中
LSCat *cat = [LSCat catInit];
} //这行cat指针被释放了,但是对象是被放入自动释放池中了
}
return 0;
}
#import <Foundation/Foundation.h>//------LSCat.h
@interface LSCat : NSObject
+(instancetype) catInit;
@end
#import "LSCat.h"//------LSCat.m
@implementation LSCat
+(instancetype) catInit{
return [[self alloc] init]; //在这后面加了个autorelease
}
-(void)dealloc{
NSLog(@"%s",__func__);
}
@end
1.强指针:默认所有的指针都是强指针
只要是有强指针指向一个对象,那么这个对象就不会被释放
只要是没有强指针指向一个对象,那么这个对象就被立即回收
__strong 强指针标示,默认所有指针都是强指针(基本不写)
2.弱指针:弱指针指向的对象不影响对象回收
__weak关键字
注意:不要用弱指针指向一个刚刚创建出来的对象,对象会被立即释放。
当出现循环引用的时候,有一端必须是弱指针。
<span style="font-size:12px;">#import <Foundation/Foundation.h>//--------main
#import "LSPerson.h"
void test(){
@autoreleasepool {
{
LSPerson *per = [[LSPerson alloc] init]; //什么时候释放看对象有没有被强指针指着
}
LSPerson *per2 = [[LSPerson alloc] init];
per2 = nil;//当指针被清空的时候,这个对象就被释放了
}
}
void test2(){
@autoreleasepool {
LSPerson *per = [[LSPerson alloc] init];
{
LSCar *car = [[LSCar alloc] init];
per.car = car;
} //这行car不会被释放,因为per.car这个强指针还是指向car的
}//在这行per被释放了,所以car也被释放了
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
LSPerson *per = [[LSPerson alloc] init];
LSCar *car = [[LSCar alloc] init];
per.car = car;
car.person = per; //当循环引用的时候,某一环必须是弱引用__weak,否则内存泄露
// __weak LSPerson *per2 = [[LSPerson alloc] init];不要创建的时候用弱指针,对象会直接释放
// NSLog(@"%p",per2);指针指向的是nil
NSLog(@"%p",car.person);//虽然car里面的person是弱指针,但是这个person被per指着,所以不会被释放
}
return 0;
}
</span>
#import <Foundation/Foundation.h>//--------LSPerson.h
#import "LSCar.h"
@interface LSPerson : NSObject
{
LSCar *_car;
}
-(void) setCar:(LSCar *)car;
@end
#import "LSPerson.h"//------LSPerson.m
@implementation LSPerson
-(void) setCar:(LSCar *)car{
_car = car;
}
-(void)dealloc{
NSLog(@"%s",__func__);
}
@end
#import <Foundation/Foundation.h>//------LSCar.h
@class LSPerson;
@interface LSCar : NSObject
{
__weak LSPerson *_persom;//如果这边不加__weak那么内存不会被回收,到底哪一方需要用弱指针,就看那个对象在控制别人的生命周期
}
-(void) setPerson:(LSPerson *)person;
-(LSPerson *)person;
@end
#import "LSCar.h"//------LSCar.m
#import "LSPerson.h"
@implementation LSCar
-(void) setPerson:(LSPerson *)person{
_persom = person;
}
-(LSPerson *)person{
return _persom;
}
-(void)dealloc{
NSLog(@"%s",__func__);
}
@end