------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一.基本简介
- ARC是iOS 5之后增加的新特性,完全消除了手动管理内存的烦恼,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再续奥担心内存管理,因为编译器为你处理了一切
- ARC是编译器特性,而不是ios 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此ARC和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化
二.基本原理
1.规则
- ARC的规则非常简单:只要还有一个强指针变量指向对象,对象就会保存在内存中
2.强指针和弱指针
- 默认所有实例变量和局部变量都是strong指针
- 弱指针指向的对象被回收后,弱指针会自动变为nil 指针,不会引发野指针错误
三.使用注意
- 不能调用release、retain、autorelease、retainCount
- 可以重写dealloc,但是不能调用[super dealloc]
- @property:想长期拥有某个对象,应该用strong,其他对象用weak
- 其它基本数据类型依然用assign
- 两端互相引用时,一端用strong、一端用weak
学习笔记代码如下
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
Person *p = [[Person alloc] init];
Dog *d = [[Dog alloc] init];
p.dog = d;
d.person = p;
return 0;
}
#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic,strong) Dog *dog;
@end
#import "Person.h"
@implementation Person
- (void)dealloc
{
NSLog(@"Person is dealloc");
}
@end
#import <Foundation/Foundation.h>
@class Person;
@interface Dog : NSObject
@property (nonatomic,weak) Person *person;
@end
#import "Dog.h"
@implementation Dog
- (void)dealloc
{
NSLog(@"Dog is dealloc");
}
@end
Block
- Block封装了一段代码,可以在任何时候执行
- Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
- 苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
int (^MySum)(int, int) = ^(int a, int b) {
return a+b;
};
定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现
Block可以访问局部变量,但是不能修改。
int sum = 10;
int (^MyBlock)(int) = ^(int num) {
sum++;//编译报错
return num * sum;
};
如果要修改就要加关键字:__block
__block int sum = 10;
Blocks和函数指针对比
- 定义函数指针 int(*myFn)();
- 定义Blocks int (^MyBlocks)(int int)
- 调用函数指针 (*myFn)(10,20)
- 调用Blocks MyBlocks(10,20);
- 在声明的同时定义变量,然后赋值
return a + b;
};
- 也可先用typedef先声明类型,再定义变量进行赋值
MySum sum = ^(int a,int b) {
return a + b;
};