——- android培训、java培训、期待与您交流! ———-
- ARC概念及原理
/*
1.指针分类
1)强指针:默认情况下都是强指针,关键字:strong
2)弱指针:关键字:__weak
2.什么是ARC
编译器特性,垃圾回收是运行时特性
3.ARC工作原理
编译时插入内存管理代码
判断:只要没有强指针指向对象,对象就释放。(忘记引用计数器)
4.ARC机制图解
*/
2.ARC快速入门
/*
1.ARC机制判断
判断是否是ARC机制
查看项目信息
不能使用retain,release autorelease retainCount
dealloc方法中不能使用 [super dealloc];
2.ARC快速使用
正常创建对象,不用手动释放对象
*/
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *dog = [Dog new];
[dog run];
}
return 0;
}
3.ARC下单对象内存管理
/*
1.ARC下单对象内存管理
2.强弱指针
*/
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 在ARC下对象释放判断依据:对象没有强指针指向
// 对象立即销毁
// __weak 弱指针 内存释放 指向nil
Dog *dog = [Dog new];
__weak Dog *dog2 = dog;
// 指针指向立即发生改变,对象没有强指针指向,对象立即销毁
dog = nil;
[dog2 run];
[dog run];
}//对象释放
return 0;
}
4.ARC下多对象内存管理
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *dog = [Dog new];
Person *person = [Person new];
/*
Person中@property (nonatomic,weak) Dog *dog;
dog = nil dog对象立即销毁
Person中@property (nonatomic,strong) Dog *dog;
dog = nil dog对象不会立即销毁
*/
person.dog = dog;
}
return 0;
}
5.ARC下循环引用问题
/*
1.ARC下循环引入问题
2.ARC下 @property set方法参数
原子性、读写 和MRC一样
MRC ARC
assign assign
retain strong(oc对象)/weak(ui控件)
copy copy
*/
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *dog = [Dog new];
Person *person = [Person new];
/*
Person中@property (nonatomic,strong) Dog *dog;
Dog中@property (nonatomic,strong) Dog *dog;
构成循环引用问题,必须其中一个weak
*/
person.dog = dog;
dog.person = person;
}
return 0;
}
6.ARC使用特点及注意事项
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1.Student new
//2.弱指针 指向
//3.创建后立即销毁
//释放空间
//stu = nil
__weak Person *person = [Person new];
NSLog(@"%d",person.age);
}
return 0;
}
7.ARC模式下如何兼容ARC的类
编译标志:
1)ARC中使用MRC(-fno-objc-arc)
2)转变为ARC(-f-objc-arc)
8.MRC转ARC