文档章节

OC语言-ARC与分类

盘盘的灰灰
 盘盘的灰灰
发布于 2016/08/08 12:12
字数 993
阅读 5
收藏 0
  •  当自动释放池结束的时候.仅仅是对存储在自动释放池中的对象发送1条release消息 而不是销毁对象.

  • 如果在自动释放池中,调用同1个对象的autorelease方法多次.就会将对象存储多次到自动释放池之中.

             在自动释放池结束的时候.会为对象发送多条release消息.那么这个是就会出现僵尸对象错误.

             所以,1个自动释放池之中,只autorelease1次,只将这个对象放1次, 否则就会出现野指针错误.

  • 将对象存储到自动释放池,并不会使对象的引用计数器+1

     所以其好处就是:创建对象将对象存储在自动释放池,就不需要在写个release了.

  •  + (instancetype)person

             {

                return [[[self alloc] init] autorelease];

             }

     

             这样,我们直接调用类方法.就可以得到1个已经被autorelease过的对象.

     

  • 结构体变量分配在栈.OC对象分配在堆.

  • 强指针与弱指针.

        强指针: 默认情况下,我们声明1个指针 这个指针就是1个强指针. 

               我们也可以使用__strong来显示的声明这是1个强指针.     

               Person *p1; 这是1个强指针. 指针默认情况下都是1个强指针.

               __strong Person *p2; 这也是1个强指针.使用__strong来显示的声明强指针.

        弱指针: 使用__weak标识的指针就叫做弱指针.           

        无论是强指针还是弱指针,都是指针,都可以用来存储地址,这1点没有任何区别 。

        都可以通过这个指针访问对象的成员.

        唯一的区别就是在ARC模式下.他们用来作为回收对象的基准.     

        如果1个对象没有任何强类型的指针指向这个对象的时候,对象就会被立即自动释放

  • 演示第1个ARC案例

         int main(int argc, const char * argv[])

            {

                @autoreleasepool

                {

                    Person *p1 = [Person new];//p1是1个强指针.

                    //因为我们说过,每1个指针变量默认情况下都是1个强指针变量.

                    NSLog(@"------");

                }//当执行到这里的时候.p1指针被回收,那么Person对象就没有任何

                //强指针指向它了. 对象就在这被回收.

                return 0;

         }

     

     
  • ARC模式下的对象回收标准

         ARC机制下释放1个对象的标准是: 没有任何强指针指向对象的时候,对象就会被释放.

         如果这个时候有弱指针指向,也会被释放.

    什么情况下叫做对象没有强指针向指向.

         1).  指向对象的强指针被回收.

         2).  指向对象的强指针被赋值为nil

     
  •  在ARC的机制下,@property参数不能使用retain

         因为retain代表生成的setter方法是MRC的标准的内存管理代码.

         而我们在ARC的机制下 不需要这些代码.

         所以,在ARC机制下的setter方法 什么都不需要做.直接赋值就可以了.

     

  • 使用建议.

         1). 在ARC机制下.如果属性的类型是OC对象类型的.绝大多数场景下使用strong

         2). 在ARC机制下.如果属性的类型不是OC对象类型的.使用assign

         3).  strong和weak都是应用在属性的类型是OC对象的时候. 属性的类型不是OC对象的时候就使用assign.

     
  • 在ARC机制下,将MRC下的retain换位strong

         @property(nonatomic,strong)Car *car;

         做的事情:

         1).  生成私有属性.并且这个私有属性是strong

         2).  生成getter setter方法的声明

         3).  生成getter setter方法的声明

              setter的实现:直接赋值.

     
  • 在ARC机制下.当两个对象相互引用的时候.如果两边都使用strong 那么就会先内存泄露.

         解决方案: 1端使用strong 1端使用weak

     
  • MRC与ARC兼容: 使用命令.  -fno-objc-arc

 

© 著作权归作者所有

共有 人打赏支持
盘盘的灰灰
粉丝 0
博文 31
码字总数 24142
作品 0
深圳
OC-基础总结(二)

OC基础总结 重新回过头看这些基础知识,对许多知识点都有新的认识,拥有坚实的基础才能更快的成长。 OC内存管理 - 基础与MRC 内存管理概述 内存管理 内存的作用:存储数据。 1). 如何将数据存...

xx_cc
2017/05/01
0
0
Managing Toll-Free Bridging

在cocoa application的应用中,我们有时会使用Core Foundation(CF),我们经常会在Objective-C和CF之间进行转化。系统使用arc的状态下,编译器不能自动管理CF的内存,这时候你必须使用CFRet...

鉴客
2012/01/09
286
0
精品 CF与OBJC在ARC下的内存管理。

http://wangjun.easymorse.com/?p=1490 « ios本地通知和远程通知 创建一个Storyboard工程 » Managing Toll-Free Bridging 在cocoa application的应用中,我们有时会使用Core Foundation(C...

晨曦之光
2012/05/28
772
0
iOS引用转换:Foundation与Core Foundation对象互相转换(__CFNSString转NSString,void *转id等等)

1. 两个框架的基本知识 1.1 Foundation 框架名是,在Xcode新建工程时可以选择导入(其实会默认自动依赖好)。Foundation框架允许使用一些基本对象,如数字和字符串,以及一些对象集合,如数组,...

陈满iOS
05/10
0
0
iOS 简单的使用UIBezierPath绘制

UIBezierPath这个类呢主要用于绘图。 之前的项目中需要绘图的部分都是用Core Graphics来绘制,OC是我的第一门语言,所以对于Core Graphics的C语言API不太适应,最近发现原来苹果的UIKit中已经...

沉恋
2015/03/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

c语言之内存分配笔记

先看一个数组: short array[5] = {1,2} // 这儿定义的一个int类型的数组,数组第1和第2个元素值是1和2.其余后面默认会给值为0; 或者 short array[] = {1,2};//这儿数组第1和第2个元素,数组...

DannyCoder
42分钟前
0
0
Shell | linux安装包不用选择Y/N的方法

apt-get install -y packageOR echo "y" | sudo apt-get install package

云迹
今天
1
0
Hadoop的大数据生态圈

基于Hadoop的大数据的产品圈 大数据产品的一句话概括 Apache Hadoop: 是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架...

zimingforever
今天
4
0
八大包装类型的equals方法

先看其中一个源码 结论:八大包装类型的equals方法都是先判断类型是否相同,不相同则是false,相同则判断值是否相等 注意:包装类型不能直接用==来等值比较,否则编译报错,但是数值的基本类型...

xuklc
今天
2
0
NoSQL , Memcached介绍

什么是NoSQL 非关系型数据库就是NoSQL,关系型数据库代表MySQL 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗...

TaoXu
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部