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