02 Object-C之ARC

//
//  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的一些浅显认知,先知道如何使用吧。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,744评论 25 709
  • Swift上的常用第三方框架 Alamofire相当于OC上的AFNetWorking,毕竟作者也是同一个人😂。不...
    陈晓寒阅读 814评论 0 3
  • 再次踏上大路,我感到无比安心,此时天已经完全黑了,一个人在偌大的校园里闲逛内心还是有些恐慌,于是我决定回宾馆...
    瞎忙活的呵呵阅读 265评论 0 0
  • 已是霜凝露冷,自然界百花凋零一时稀,而那千姿百态的菊花,却正在迎风怒放。 中山公园菊花展熙熙攘攘,不管是人还是菊花...
    没起名字阅读 325评论 1 1