1.指针分2种:
》强指针:默认情况下,所有的指针都是强指针 __strong。
》弱指针:__weak。说明:当一个弱指针指向一个创建出来的对象,而之后没有强指针指向该对象,那么该对象会在内存中被释放,弱指针被赋值成空 nil 。
代码表现形式:
Dog * p1 = [ [Dog alloc] init ] ; // p1 为强指针,指向新创建出来的对象,引用计数器 = 1
__weak Dog * p2 = p1; // p1所指向的对象的引用计数器不会+1,引用计数器还是 = 1
p1 = [ [Dog alloc] init ] ; // p1又指向了新的对象,这行代码之后,旧对象就会在内存中被释放且p2 = nil ,因为该对象没有强指针指向它。如果这行代码换成 p1 = nil ; 效果一样.
2.ARC判断准则: 只要没有强指针 指向 堆内存中的对象 ,该对象的内存就会被自动翻译。
3.ARC特点:
》不请允许调用release , retain , retainCount .
》允许重写dealloc对象方法,但是不 允许调用 [super dealloc] ;
》@property 参数:
》strong : 成员变量是强指针,适用于OC对象。@propery (nonatomic , strong) Dog * dog; //表示dog对象指针是 强 指针类型。
》weak : 成员变量是弱指针,适用于OC对象。@propery (nonatomic , weak) Dog * dog; //表示dog对象指针是 弱 指针类型。
》以前的retain 改为用 strong,也就是 有多少个强指针 指向 创建出来的 对象,那么该对象的引用计数器等于几。
4.自动管理内存(ARC)的互引用:
》问题:strong 对象的指针 出现了循环互引用。这样就会导致在一个相互指向的循环圈内的对象内存不能被释放,出现内存泄漏问题。
》解决:一端用strong 类型指针,一端用weak类型指针。只要没有出现 强指针类型的对象 循环指向就可以解决该问题。