黑马程序员--Objective-C——ARC

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

在前面学习内存管理的时候,我们知道,ARCAutom Reference Counting)是一个编译器特性,会自动帮我们release,是IOS5的新功能。现在,我们来学习一下ARC的具体用法。

 

一、ARC的特性


1.内存管理方法都不能使用了

当我们开启了项目的ARC后会发现

 

 

 

我们在main中创建一个新对象

<span style="background-color: rgb(255, 255, 255);">int main(int argc, const char * argv[])
{
    Person *p = [[Person alloc] init];
    
    return 0;
}</span>


会自动释放对象

 

 

2.允许重写deallloc,但不允许调用[super dealloc]


3.@property的参数:

strong 成员变量是强指针,相当于原来的retain,适用于OC对象

weak 成员变量是弱指针,相当于与原来的assign,适用于OC对象类型

assign:适用于非OC对象类型

 

有了这些特性,我们怎么写程序都不用担心内存问题啦!

 

二、ORC的判断准则

没有调用release方法,ARC是怎么判断是否释放对象呢?

判断准则:只要没有强指针(以前学过的指针都是强指针)指向该对象,对象对自动释放。

上例中,main函数运行结束后,指针变量p被销毁,此时没有强指针指向对象,对象就释放了。

 

三、弱指针

在指针声明前加上__weak

 

四、ARC循环引用

新建一个工程,新建PersonDog

Person.h

<span style="background-color: rgb(255, 255, 255);">#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic, strong) Dog *dog;
@end</span>

Person.m

<span style="background-color: rgb(255, 255, 255);">#import "Person.h"
 
@implementation Person
- (void)dealloc
{
    NSLog(@"Person对象被释放了!");
}
@end</span>


Dog.h

<span style="background-color: rgb(255, 255, 255);">#import <Foundation/Foundation.h>
 
@class Person;
@interface Dog : NSObject
@property (nonatomic, strong) Person *person;
@end</span>

Dog.m

<span style="background-color: rgb(255, 255, 255);">#import "Dog.h"
 
@implementation Dog
- (void)dealloc
{
    NSLog(@"Dog对象被释放了!");
}
@end</span>

 

main.m

<span style="background-color: rgb(255, 255, 255);">#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[])
{
    Person *p = [[Person alloc] init];
    Dog *d = [[Dog alloc] init];
    
    p.dog = d;
    d.person = p;
    return 0;
}</span>

运行后,发现没有任何输出。这是因为,这两个对象互相引用,并且都是强指针,程序执行完毕后,两个对象产生了都死锁。此时,把任意一个对象的引用变为弱指针即可。

Person对象的指针变为弱指针,两个对象成功释放。

 

 

五、非ARC项目转ARC

选择Edit->Refactor->Convert to Objective-C ARC菜单

 

会将整个非ARC项目转为ARC项目。

如果想让部分文件保留非ARC特性

点击项目,选择Build Phases,双击需要改变的文件,在Compiler Flags里加入编译参数“-fno-objc-arc”即可。

 

同样地,如果想一个非ARC项目的部分文件具有ARC特性,将这些文件的Compiler Flag改成“-f-objc-arc




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值