Objective-C中得MRC与ARC

MRC

内存管理

任何继承自NSObject的对象都需要内存管理,非对象类型不需要(int、char、float、double、struct、enum等 )
OC通过引用计数来判断是否需要回收一个对象所占用的内存,每一个OC对象都有自己的引用计数器,是一个4个字节的整数,表示多少人正在使用这个对象。如果引用计数器为0时,对象的内存就会被回收,如果不为0就不会被回收。

当使用alloc、new、copy创建一个对象是,对象的引用计数为1.
给对象发一个retain消息,可以使引用计数+1
给对象发一个release消息,可以使引用计数器-1
给对象发送retainCount消息, 可以获得当前的引用计数器值
当一个对象的引用计数器值为0时
这个对象即将被销毁,其占用的内存被系统回收
系统会自动给对象发送一条dealloc消息
(因此, 从dealloc方法有没有被调用, 就可以判断出对象是否被销毁)
一旦重写了dealloc方法, 就必须调用[super dealloc],并且放在最后面调用

//.h
@interface ZZPerson : NSObject


- (void) test;

@end
//.m
@implementation ZZPerson


- (void) test
{
    NSLog(@"Person test");
}

-(void) dealloc
{
    NSLog(@"Person 回收");
    [super dealloc];
}

@end

int main(int argc, const char * argv[]) {

    ZZPerson *person = [[ZZPerson alloc] init];//1

    long count  = [person retainCount];
    NSLog(@"%zd",count);//1

    [person retain];
    NSLog(@"%zd",[person retainCount]);//2
    [person release];

    NSLog(@"%zd",[person retainCount]);//1
    [person release];// Person 回收

    person = nil;
//  当一个指针指向 nil,这个指针我称为空指针
//  给空指针发送消息系统不会报错,它什么都不做
    [person test];

    NSLog(@"%zd",[person retainCount]);
    return 0;
}

内存管理原则

  1. 谁创建谁release : 如果你通过alloc、new或[mutable]copy来创建一个对象,那么你必须调用release或autorelease
  2. 谁retain谁release :只要你调用了retain,就必须调用一次release

property参数

retain : release旧值,retain新值(用于OC对象)
assign : 直接赋值,不做任何内存管理(默认,用于非OC对象类型)
copy : release旧值,copy新值(一般用于NSString *)

循环retian

多个对象相互retiam,比如A对象retain了B对象,B对象retain了A对象,这样会导致A对象和B对象永远无法释放
循环retain的解决方案
循环的一端用assign

autorelease

autorelease方法的基本作用
1. 给对象发送一条autorelease消息, 会将对象放到一个自动释放池中
2. 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3. 会返回对象本身
4. 调用完autorelease方法后,对象的计数器不变

autorelease的好处
1. 不用再关心对象释放的时间
2. 不用再关心什么时候调用release

autorelease的使用注意
1. 占用内存较大的对象不要随便使用autorelease
2. 占用内存较小的对象使用autorelease,没有太大影响

自动释放池@autoreleasepool

当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池
当自动释放池被销毁时,释放对象。

ARC

编译器会自动在适当的地方插入适当的retain、release、autorelease语句
也就是说, 编译器会自动生成内存管理的代码, 不用程序猿手动编写

不能调用release、retain、autorelease、retainCount

可以重写dealloc,但是不能调用[super dealloc]

ARC中的@property
1. strong : 用于OC对象, 相当于MRC中的retain
2. weak : 用于OC对象, 相当于MRC中的assign
3. assign : 用于基本数据类型, 跟MRC中的assign一样
4. copy : 一般用于NSString, 跟MRC中的copy一样

MRC转为ARC

Objective-C中得MRC与ARC_第1张图片

你可能感兴趣的:(IOS学习)