黑马程序员---OC ARC

指针的分类:

1)强指针:默认情况下,所有的指针都是强指针,关键字是strong

2)弱指针:--weak关键字修饰的指针

声明一个弱指针如下:

--weak Person* p

ARC工作原理:

ARCObjective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入releaseautorelease

ARC的判断原则

只要没有请指针指向对象,对象就会释放

1、ARC下循环引用问题

person.h

#import <Foundation/Foundation.h>

@class Dog;
@interface Person : NSObject

//dogstrong 强指针
@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,不需要加_ _。 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值