黑马程序员技术交流社区
标题: ARC知识学习小结 [打印本页]
作者: tz19900926 时间: 2015-9-26 10:23
标题: ARC知识学习小结
本帖最后由 tz19900926 于 2015-9-26 10:33 编辑
ARC概念及原理
1、指针分类(oc)
强指针 strong (默认)
弱指针 __weak (两个下划线)
声明一个弱指针 __weak Person *p;
ARC中暂时忘记引用计数器及release,retain,retainCount
ARC判断是否回收对象的标准是:
如果一个对象没有被抢指针指向,那么就回收
ARC机制下不能使用release,retain,retainCount
2、ARC机制
1)判断是否是ARC机制:
查看项目信息,不能使用retain,release,autorelease
在dealloc中不能使用[super dealloc];
2)正常创建对象,不用手动释放对象
在ARC机制下,对象如果没有抢指针指向,对象会立即销毁
Car *bigBen = [Car new];
bigBen = nil; //bigBen的指针发生改变,对于car对象来说没有抢指针指向了,所以要释放对象
ARC强指针 弱指针
在ARC机制下 对于对象的创建@property参数不能使用retain,应该使用strong,weak;
ARC下循环引用问题
Person类中有Dog类
Dog类中有Person
此时头文件引用一定要用@class不然会报错
@class Dog; //在Person类里面创建一个Dog
@interface Person :NSObject
@property (nonatomic,strong) Dog * dog;
@edn
@class Person; //在Dog类里创建一个Person类的owner
@interface Dog : NSObject
@property (nonatomic,strong) Person *owner;
@end
在main函数需要导入Person.h和Dog.h
因为在类文件中引用的是@class
int main{
@autoreleasepool{
Dog *dog = [Dog new];
Person *p = [Person new];
} //运行到这一行两个对象会被释放
return 0;
}
int main{
@autoreleasepool{
Dog *dog = [Dog new];
Person *p = [Person new];
//构成一个循环引用
p.dog = dog;
dog.owner = p;
return 0;
}
}运行完之后指针没有了,但是两个对象依然互指,不会被释放
这样的结果会造成内存泄漏
防止方法是,我们应该给其中一个设置成弱指针
@property (nonatomic,weak) Dog * dog;
此时,person指向的dog是弱指针,当’}’执行完,Person是被Dog强指针指着,但是Person指向的Dog是弱指针,因此Dog被释放,Dog被释放后,Person也没有被强指针指向,所以也会被释放
ARC下set方法内存的@property参数
原子性\读写 和MRC下是一样的
不同
MRC ARC
assign assign
retain strong 强指针 适用于OC对象,相当于MRC中的retain
copy weak 弱指针 常用于UI控件,相当于MRC中的assign
copy 一般用于NSString 两者相同
ARC情况下解决循循环”retain”的问题:@property一边用strong一边用weak
ARC特点总结
1 不允许调用release,retain,retainCount
2 允许重写dealloc方法,但不允许调用[super dealloc];
3 @property参数:
strong 用于oc对象类型 强指针
weak 用于oc对象类型 弱指针
assign 用于非oc对象类型的基础类型
使用注意事项
1 ARC只要弱指针指向的对象不存在了,会直接赋值弱指针做清空(赋值nil)
2 __weak Student *stu = [Student new];
1)student new 产生空间
2)弱指针 stu 指向
创建完马上就释放了,没有意义
弱指针指向对象销毁过程
1)释放对象空间
2)stu = nil
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |