A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tz19900926 中级黑马   /  2015-9-26 10:23  /  693 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马