文档章节

黑马程序员-10-Objective-C学习笔记(ARC)

 明天过后1
发布于 2014/10/05 22:50
字数 1896
阅读 35
收藏 0
点赞 0
评论 0

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

1. ARC是什么

    (1) 由于在IOS开发中如果没有ARC程序员要花大量的精力去管理内存,那么开发效率就大大地降低了。

    (2) ARC( Auto Reference Counting )是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切

    (3) ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化


2. ARC有什么用

    其实ARC既然是编译器特性,那么它的作用是帮助我们自动生成内存管理代码,既然会自动生成内存管理代码,肯定不会随便生成,它肯定是依据一定的原则来判断是否生成:

    a. ARC管理内存的原则

        ARC管理内存的原则 : 只要还有一个强指针变量指向对象,对象就会保持在内存中,如果没有强指针指向该对象,该对象就会被release

    b. 强指针 和 弱指针

        (1) 强指针 : 把一个指针说明为强指针的关键字是 __strong ,默认情况下所有对象实例的变量和局部变量都是强指针

        (2) 弱指针 : 把一个指针说明为弱指针的关键字是 __weak

   /************************************* Student.h ***********************************************/ 
    #import<Foundation/Foundation.h>
    
    @interface Student : NSObject
    
    @property (noatomic,assign) int age;
    
    @end;
    
    /************************************* Student.m ***********************************************/ 
    #import "Student.h"
    @implementation Student
    
    -(void)dealloc
    {
        NSLog(@"Student is dealloc");
        // [super dealloc];                                                        // 在ARC中会自动插入这句代码
    }
    @end
    
    
    /************************************* 强指针 ***********************************************/
    
    #import "Student.h"
    
    int main()
    {
        Student *s = [[Student alloc] init];                                        // 默认情况下都是强指针,因此这句相当于 : __strong Student *s = [[Student alloc] init];
        
        /* 强指针转移指向的 ARC处理:
        // 强指针转移指向的时候会插入以下代码 :
        [s release];
        s = nil;
        s = [[Student alloc] init];                                                 // 这时候 s 转移指向到另外一个新的对象,那么原来旧的对象就没有强指针指向,那么ARC会在此代码之前加入左边的代码
        */
        
        /* 强指针被置为空时的 ARC处理:
        // 强指针被置为空时会插入以下代码 :
        [s release];
        s = nil;                                                                    // 当强指针被置为空的时候,相当于Student对象在内存中失去强指针的指向,那么ARC会加入左边的代码
        */
        
        /* ARC 会在代码块结束前对对象进行一些销毁工作
        [s release];
        s = nil;
        */
        return 0;
    }                                                                              // 程序执行到这里的时候局部变量 s 被回收了,没有强指针指向该对象,左边return前的代码,因此会打印 : Student is dealloc
    
    /************************************* 弱指针 ***********************************************/
    
    #import "Student.h"
    int main()
    {
        Student *s = [[Student alloc] init];                                        // 默认情况下都是强指针,因此这句相当于 : __strong Student *s = [[Student alloc] init];
        
        /* 弱指针指向一个新创建的对象,这种做法毫无意义,因为在这行执行后该对象会立即销毁
         __weak Student *s1 = [[Student alloc] init];                               // 对于这种写法,根据ARC判断原则,在这行代码执行后会插入内存管理代码把该对象销毁,因此会打印 : Student is dealloc
        */
        __weak Student *s1 = s;                                                     // 定义一个弱指针来保存强指针的内存地址
        
        s = nil;                                                                    // 强指针被置为空,那么对象在内存中只有弱指针指向该对象,根据ARC管理内存的原则,会插入内存管理代码把该对象销毁,                                                                                            // 因此会打印 : Student is dealloc
        return 0;
    }


3. ARC使用注意

    (1) 不能调用release、retain、autorelease、retainCount

    (2) 可以重写dealloc,但是不能调用[super dealloc]

    (3) @property : 想长期拥有某个对象,应该用strong,其他对象用weak

    (4) 其他基本数据类型依然用assign

    (5) 两端互相引用时,一端用strong、一端用weak

 /************************************* Dog.h ***********************************************/ 
    #import<Foundation/Foundation.h>
    @class Student
    
    @interface Dog : NSObject                                                      

    /* 没有ARC之前的写法
    @property (noatomic,retain) NSString *name;
    */
    @property (noatomic,strong) NSString *name;                                    // 使用ARC后对于OC对象把retain策略改为strong策略,它生成的set方法跟retain策略的set方法一样,但在dealloc方法中会自动
                                                                                   // 插入 [name release];来销毁对象
                                                                                   
    @property (noatomic,weak) Student *owner;                                      // 循环引用其中一方使用 strong ,另外一方使用 weak
    
    @end
    
 /************************************* Dog.m ***********************************************/ 
    #import "Dog.h"
    #import "Student.h"
    
    @implementation Dog
    -(void)dealloc
    {
        NSLog(@"Dog is dealloc");
       // [super dealloc];                                                         // 重写dealloc,但是不能调用[super dealloc],ARC会自动帮助我们插入                                                                   
    }
    @end
    
 /************************************* Student.h ***********************************************/ 
    #import<Foundation/Foundation.h>
    @class Dog
    
    @interface Student : NSObject
    
    @property (noatomic,assign) int age;                                          // 对于基本数据类型依然使用 assign 策略
    
    @property (noatomic,strong) Dog *dog;                                         // 循环引用其中一方使用 strong ,另外一方使用 weak
    
    @end;
    
    /************************************* Student.m ***********************************************/ 
    #import "Student.h"
    #import "Dog.h"
    
    @implementation Student
    
    -(void)dealloc
    {
        NSLog(@"Student is dealloc");
    }
    @end
    
   /************************************* main.m ***********************************************/ 
   #import "Student.h"
   #import "Dog.h"
   
   int main()
   {
       Student *s = [[Student alloc] init];
       Dog *dog = [[Dog alloc] init];
       
       dog.name = @"mike";
       dog.owner = s;
       
       s.age = 22;
       s.dog = dog;
        
       return 0;
   }                                                                                  // 程序结束对象被回收,强指针本置为空,打印结果 : Student is dealloc Dog is dealloc


4. Xcode对ARC 开启和禁止    

     要想将非ARC的代码转换为ARC的代码,大概有2种方式:
        (1) 使用Xcode的自动转换工具
        (2) 手动设置某些文件支持ARC 

    a. Xcode把非ARC代码转化为ARC模式

         Xcode带了一个自动转换工具,可以将旧的源代码转成ARC模式
         (1) ARC是LLVM 3.0编译器的特性,而现有工程可能使用老的GCC 4.2或LLVM-GCC编译器,因此首先需要设置使用LLVM 3.0编译器:(现使用的XCode4.5,LLVM 3.0已经升级到LLVM 4.1) 

         (2) 最好也选上Warnings中的Other Warning Flags 为 -Wall,这样编译器就会检查所有可能的警告,有助于我们避免潜在的问题 

                

        (3) Build Options下面的Run Static Analyzer选项也最好启用,这样每次Xcode编译项目时,都会运行静态代码分析工具来检查我们的代码 

                

        (4)  设置"Objective-C Automatic Reference Counting"选项为YES,不过Xcode自动转换工具会自动设置这个选项,这里只是说明一下如何手动设置

                

        (5) 打开Xcode的自动转换工具,选择要转换的文件

                

        (6) 点击Check按钮,Xcode可能会弹出对话框提示项目不能转换为ARC,需要你准备好转换(这里暂时省略详细说明)   

             

        (7) 如果没有什么警告、错误了,就会弹出一下提示窗口

            

        (8) 点击Next,几秒钟后,Xcode会提示所有文件的转换预览,显示源文件的所有改变。左边是修改后的文件,右边是原始文件。在这里你可以一个文件一个文件地查看Xcode的修改,以确保Xcode没有改错你的源文件:

            

        (9) 点击Save即可完成转换

                注意 : 自动转换之后,Xcode会移除所有retain、release、autorelease调用,这可能会导致代码出现其它警告、无效语法等,这些都需要自己手工进行修改

    b. 手动 开启 和 禁止 某些文件的ARC

        (1) 在Compiler Flags一列加上-fobjc-arc就表示开启这个.m文件的ARC
        (2) 在Compiler Flags一列加上-fno-objc-arc就表示禁止这个.m文件的ARC 

            

            

            




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

 详情请查看:http://edu.csdn.net/heima



© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 20
码字总数 36166
作品 0
佛山
TIOBE编程语言排行榜:Objective-C蝉联“年度语言”

TIOBE发布了最新的编程语言排行版,Objective-C连续第2年获得“年度语言”殊荣。年度语言是指在上一年份额增长最多的语言。Objective-C最新的份额为10.283%,比去年同期增长了3.37%。在2010年...

oschina ⋅ 2013/01/06 ⋅ 46

给大家分享黑马程序员Android课程笔记

黑马程序员课程笔记,这套笔记目的是让黑马的学员能够有一个详细的课下资料,也非常适合想学习Android的同学。 这套课程笔记包含内容: 1.Android基础视频部分: 2.Android360项目: 3.智慧北...

小梦想家 ⋅ 2015/12/04 ⋅ 4

年度最佳编程语言 Objective-C当仁不让

【IT168 资讯】Tiobe 公布了2011年11月编程语言排行榜,前二十排名无多大变化。从下图的排行榜可以看到,依然是C阵营的天下。   距 Tiobe 发布2011年年度编程语言只有两个月的时间了,这个...

博客园 ⋅ 2011/11/11 ⋅ 0

Objective-C自动引用计数ARC

写在前面 这篇文章是阅读 Transitioning to ARC Release Notes 的笔记。 主要内容是关于 ARC 的规则。 简介 Automatic Reference Counting(ARC) 作为一个编译工具,自动管理 Objective-C 对象...

JiandanDream ⋅ 05/09 ⋅ 0

理解 iOS 的内存管理

引言: ARC的出生及成长背景 苹果在 2011 年的时候,在 WWDC 大会上提出了自动的引用计数(ARC)。ARC 背后的原理是依赖编译器的静态分析能力,通过在编译时找出合理的插入引用计数管理代码,...

满脸胡茬的小码农 ⋅ 2017/11/17 ⋅ 0

[Objective-C]__bridge,__bridge_retained和__bridge_t

使用ARC能帮我们减轻不少内存管理方面的负担,尤其是对用惯了Java的程序员来说。但是像我这种Java基础本身就不牢固,做了两年的iOS已经习惯手动管理内存的半吊子,使用ARC还是经常碰壁。 最近...

burning_oc ⋅ 2015/11/30 ⋅ 0

11月编程语言排行榜:Objective-C能成为年度编程语言?

Tiobe公布了2011年11月编程语言排行榜,前二十排名无多大变化。从下图的排行榜可以看到,依然是C阵营的天下。 距Tiobe发布2011年年度编程语言只有两个月的时间了,这个奖项是颁给这一年里评级...

vVqsGHcN ⋅ 2011/11/09 ⋅ 37

《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言

《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言 原创文章,欢迎转载。转载请注明:关东升的博客 在Swift语言出现之前,开发iOS或OS X应用主要使用Objective-C...

智捷课堂 ⋅ 2016/02/24 ⋅ 0

iOS5 ARC学习笔记

iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存。但是学习还是很有必要的。 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,...

长平狐 ⋅ 2012/08/13 ⋅ 0

IOS学习笔记——Objective-c基础(一)

最近自学ios,ios的支持语言是Objective-c,所以要学习ios就需要先学习Objective-c语言。当掌握了Objective-c的基础知识之后,我们就可以入手学习iOS开发做出一些自己的应用。 我现在还是...

丛林迷雾 ⋅ 2012/12/30 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud构建微服务架构—创建“服务注册中心”

创建一个基础的Spring Boot工程,命名为eureka-server,并在pom.xml中引入需要的依赖内容: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par......

itcloud ⋅ 2分钟前 ⋅ 0

拖动

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>event</title> <style> #box { width: 100px; height: 100px; background-color: aquamarine; position: absolute; } </style......

fyliujj ⋅ 5分钟前 ⋅ 0

es6 polyfill array

polyfill之javascript函数的兼容写法——Array篇 1. Array.isArray(obj) if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[objec......

球球 ⋅ 6分钟前 ⋅ 0

kibana启动异常

检查一下:kibana.yml 每一对key:value中,冒号之后应有空格。

增删改查1 ⋅ 8分钟前 ⋅ 0

js修改img的src属性刷新图片时的图片缓存问题

问题:上传一张图片,通过js更新src属性刷新图片使其即时显示时, 当img的src当前的url与上次地址无变化时(只更改图片,名称不变,不同图片名称相同)图片不变化(仍显示原来的图片) 但通过...

HaierBrother ⋅ 9分钟前 ⋅ 0

Mysql

1.Jdbc Url 设置allowMultiQueries为true和false mysql的批量更新是要我们主动去设置的, 就是在数据库的连接url上设置一下,加上* &allowMultiQueries=true *即可。 参数名称 参数说明 缺省...

瑟青豆 ⋅ 12分钟前 ⋅ 0

mysql导出导入表结构与数据

当我们需要进行数据迁移时,mysql自带的mysqldump会是最好的方式。 1.导出某张表的结构和数据 首先,我们应当使用服务器,打开终端,连接到所需要导出的表所在的服务器上。执行命令: mysqld...

hengbao5 ⋅ 12分钟前 ⋅ 0

世界杯也走向“比拼”大数据的时代

《日本经济新闻》6月19日报道称,俄罗斯足球世界杯已于6月14日揭开战幕。作为第21次举办的足球世界杯,如何活用大数据有可能成为决定各支球队胜负的重要因素。从对阵球队的分析到战术建议,还...

加米谷大数据 ⋅ 13分钟前 ⋅ 0

金额转为千分制,金额转中文大写

金额转关为大写 js /** 数字金额大写转换(可以处理整数,小数,负数) */ function digitUppercase(n){ if(!n) reutrn "" let fraction = ['角', '分']; let digit = ['零', '壹', '贰', '叁', ...

YXMBetter ⋅ 15分钟前 ⋅ 0

开发利器JRebel部署SpringBoot项目

不要以为年纪轻轻就跌倒了人生谷底,未来还有更大的下降空间等着你。 idea下载和安装JRebel 激活JRebel 访问https://my.jrebel.com/ 使用facebook或twitter登录 勾选 Build project automati...

郑龙飞 ⋅ 21分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部