指针的分类:
1)强指针:默认情况下,所有的指针都是强指针,关键字是strong
2)弱指针:--weak关键字修饰的指针
声明一个弱指针如下:
--weak Person* p
ARC工作原理:
ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease,
只要没有请指针指向对象,对象就会释放
1、ARC下循环引用问题
person.h
#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
//dog是strong 强指针
@property (nonatomic,strong) Dog *dog;
@end
person.m
#import "Person.h"
@implementation Person
//重写dealloc方法,检测是不是内存泄漏
- (void)dealloc
{
NSLog(@"Person dealloc");
}
@end
dog.h
#import <Foundation/Foundation.h>
@class Person;
@interface Dog : NSObject
//owner也是强指针
@property (nonatomic, strong) Person *owner;
@end
dog.m
#import "Dog.h"
@implementation Dog
- (void)dealloc
{
NSLog(@"Dog dealloc");
}
@end
main.m
Person *p = [Person new];
Dog *d = [Dog new];
//互相引用
p.dog = bigYellowDog;
bigYellowDog.owner = p;
这时会出现内存泄漏情况
解决方案:
循环引入的对象中其中一个对象设置为strong 另一个设置为weak
ARC下@property参数
ARC中的@property
strong : 用于OC对象, 相当于MRC中的retain
weak : 用于OC对象, 相当于MRC中的assign
assign : 用于基本数据类型, 跟MRC中的assign一样
copy : 一般用于NSString, 跟MRC中的copy一样在ARC情况下解决”循环retain”的问题:@property一边用strong,一边用weak。
ARC特点总结
(1)不允许调用release,retain,retainCount
(2)允许重写dealloc,但是不允许调用[super dealloc]
(3)@property的参数:
strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针assign:适用于非OC对象类型(基础类型)
ARC使用注意事项
1)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作。
2)__weak Person *p=[[Person alloc] init];不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针设置为nil。
3)ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再
[super dealloc]。
@property(nonatomic,strong)Dog *dog;
意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
4)如果换成是弱指针,则换成weak,不需要加_ _。