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