02 Object-C之ARC

2018-01-26  本文已影响9人  紫苓
//
//  Person.h
//  IOS_Study_Sample
//
//  Created by luozheng on 2018/1/25.
//  Copyright © 2018年 luozheng. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject

/**
 * 在MRC中,用了retain、assign来修饰变量,
 * 在ARC中,改成了strong、weak、assign来修饰,其中strong、weak只能用来修饰对象,不能修饰基本数据类型
 */
@property (nonatomic,strong) NSString * name;
@property (nonatomic,assign) int age;

+(Person *) initWithArguments:(NSString *)name age:(int)age;

@end



//
//  Person.m
//  IOS_Study_Sample
//
//  Created by luozheng on 2018/1/25.
//  Copyright © 2018年 luozheng. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)dealloc
{
    NSLog(@"Person(name=%@,age=%d)被销毁了!",_name,_age);
}


+(Person *) initWithArguments:(NSString *)name age:(int)age
{
    Person *person = [[self alloc] init];
    person.name = name;
    person.age = age;
    return person;
}

@end


//
//  main.m
//  03-ARC机制
//
//  Created by luozheng on 2018/1/25.
//  Copyright © 2018年 luozheng. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
/**
 * ARC:总结起来就是一句话:任何一个对象,只要没有强指针指向它,那么它就会立即被系统回收。
 * 也就是说,在ARC机制下,一个对象是否被立即回收的唯一依据就是是否存在强指针在指向它。
 * 注意这里的立即二字,object-c的ARC机制不同于java中的垃圾回收机制,java中的垃圾回收机制对于一个不用的对象,
 * 它很可能不会被立即回收,而是要等到系统内存比较吃紧的时候,系统触发GC操作后才可能会被回收,而object-c是
 * 时时刻刻在检测着,只要一检测到某个对象没有强指针指向它,立马就回收掉。
 */

int main(int argc, const char * argv[]) {
    
    /**
     * 使用类方法创建对象,然后赋值给一个强指针p1,这个时候系统没有对person进行回收,WHY???
     * 主要是因为,使用类方法创建对象的时候,ARC会添加相应的autorelease操作,在MRC中已经知道,
     * 通过autorelease操作的对象只有在@autoreleasepool作用域结束的时候才会被销毁掉,
     * 所以这里创建的对象是不会被销毁的
     */
    // 这句相当于是:Person *p1 = person;
    Person *p1 = [Person initWithArguments:@"张三疯1" age:55];
    // 这句仅仅是把指针p1指向了nil,但是并没有把person指向nil,person指针智只能通过@autoreleasepool来释放
    // 所以,目前person对象依旧还有一个强指针在指向它,因而对象不会被回收。
    p1 = nil;
    NSLog(@"0000000000000");
    NSLog(@"-------------------------------------------------");
    
    /**
     * 这种写法就能释放掉了。
     */
    @autoreleasepool {
        Person *p2 = [Person initWithArguments:@"张三疯" age:50];
        NSLog(@"111111111111 name = %@",p2.name);
    }
    NSLog(@"2222222222222222");
    NSLog(@"-------------------------------------------------");
    
    
    /**
     * 只要是在@autoreleasepool中调用了类方法(本质是autorelease操作要在@autoreleasepool中进行),
     * 对象在出了@autoreleasepool作用域后,都会调用一次对象的release操作。
     */
    Person * p3 = nil;
    @autoreleasepool {
        p3 = [Person initWithArguments:@"张三疯1" age:60];
        NSLog(@"333333333333 name = %@",p3.name);
    }
    NSLog(@"44444444444444");
    p3 = nil;// 如果没有这一句,那么对象只有在main运行结束后才会被销毁。
    NSLog(@"-------------------------------------------------");
    
    return 0;
}


以上,都是目前对ARC的一些浅显认知,先知道如何使用吧。

上一篇 下一篇

猜你喜欢

热点阅读