文档章节

OC语言-内存管理

盘盘的灰灰
 盘盘的灰灰
发布于 2016/08/07 23:40
字数 1676
阅读 6
收藏 0
点赞 0
评论 0
  • 万能指针(NSObject、id). instancetype

         NSObject和id 它们都是万能指针,可以指向任意的OC对象.

         NSObject指针访问对象的成员的时候,编译器会做编译检查.

         id指针调用指针指向的对象的方法的时候.编译器不做任何检查 直接通过.

         id指针的缺点: 不能使用->访问属性 也不能使用点语法.

         instancetype: 只能做为方法的返回值.代表返回当前类的对象.

  • 引用计数器  

         1). 每1个对象都有1个属性.叫做retainCount.叫做引用计数器. 类型是unsigned long 占据8个字节.

             引用计数器的作用: 用来记录当前这个对象有多少个人在使用它.     

             默认情况下,创建1个对象出来 这个对象的引用计数器的默认值是1.

         2). 当多1个人使用这个对象的时候.应该先让这个对象的引用计数器的值+1 代表这个对象多1个人使用.

         3). 当这个对象少1个人使用的时候.应该先让这个对象的引用计数器的值-1 代表这个对象少1个人使用.

         4). 当这个对象的引用计数器变为0的时候.代表这个对象无人使用. 这个时候系统就会自动回收这个对象.

  • 如何操作引用计数器.

         1). 为对象发送1条retain消息. 对象的引用计数器就会加1. 当多1个人使用对象的时候才发.

         2). 为对象发送1条release消息.对象的引用计数器就会减1. 当少1个人使用对象的时候才发.

         3). 为对象发送1条retainCount消息. 就可以去到对象的引用计数器的值.

         就这样++ -- 当对象的引用计数器变为0的时候,对象就会被系统立即回收.

         在对象被回收的时候.会自动调用对象的dealloc方法.

  • [super dealloc]写在最后一句。

    原因:你所创建的每个类都是从父类,根类继承来的,有很多实例变量也会继承过来,这部分变量有时候会在你的程序内使用,它们不会自动释放内存,你需要调用父类的 dealloc方法来释放,然而在此之前你需要先把自己所写类中的变量内存先释放掉,否则就会造成你本类中的内存积压,造成泄漏

  •  野指针

         C语言中的野指针: 定义1个指针变量.没有初始化.这个指针变量的值是1个垃圾值,指向1块随机的空间.这个指针就叫做野指针.

         OC中的野指针: 指针指向的对象已经被回收了.这样的指针就叫做野指针.

  •  回收对象:

         所谓的对象的回收,指的是对象占用的空间可以分配给别人.

         当这个对象占用的空间没有分配给别人之前 其实对象数据还在. 

  •  僵尸对象

        1个已经被释放的对象,但是这个对象所占的空间还没有分配给别人.这样的对象叫做僵尸对象.

  • 内存泄露.

         指的是1个对象没有被及时的回收.在该回收的时候而没有被回收

         一直驻留在内存中,直到程序结束的时候才回收. 

  •  错误代码写法:

- (void)setCar:(Car *)car

     {

        _car = [car retain];

     }

     - (void)dealloc

     {

        [_car release];

        [super dealloc];

     }

当属性是1个OC对象的时候,setter方法照着上面那样写,其实还是有Bug的.

     当为对象的这个属性多次赋值的时候.就会发生内存泄露.

     发生泄露的原因: 当为属性赋值的时候, 代表旧对象少1个人用.新对象多1个人使用.

     应该relase旧的 retain新的.

     - (void)setCar:(Car *)car

     {

         [_car release];

         _car = [car retain];

     }

  • 在MRC的开发模式下.1个类的属性如果是1个OC对象类型的.那么这个属性的setter方法就应该按照下面的格式写.  

         - (void)setCar:(Car *)car

         {

             if(_car != car)

             {

                [_car release];

                _car = [car retain];

             }

         }

         还要重写dealloc方法.

         - (void)dealloc

         {

            [_car release];

            [super delloc];

         }

         如果属性的类型不是OC对象类型的.不需要像上面那样写. 还是像之前那样写就OK了.

  • 介绍一下@property的四组参数.

             a. 与多线程相关的两个参数.

                atomic、nonatomic.

             b. 与生成的setter方法的实现相关的参数.

                assign、retain.

             c. 与生成只读、读写相关的参数       

                readonly readwrite

             d. 是与生成的getter setter方法名字相关的参数.

                getter  setter 

  •  介绍与多线程相关的参数.

         atomic: 默认值. 如果写atomic,这个时候生成的setter方法的代码就会被加上一把线程安全锁.

                 特点: 安全、效率低下.

         nonatomic: 如果写nonatomic 这个时候生成的setter方法的代码就不会加线程安全锁.

                 特点: 不安全,但是效率高.

         建议: 要效率. 选择使用nonatomic  在没有讲解多线程的知识以前 统统使用nonatomic

  • 与生成的setter方法的实现相关的参数.

         assign: 默认值 生成的setter方法的实现就是直接赋值.

         retain: 生成的setter方法的实现就是标准的MRC内存管理代码.

                 也就是. 先判断新旧对象是否为同1个对象 如果不是 release旧的   retain新的.

         当属性的类型是OC对象类型的时候,那么就使用retain

         当属性的类型是非OC对象的时候,使用assign.

         千万注意:

         retain参数.只是生成标准的setter方法为标准的MRC内存管理代码 不会自动的再dealloc中生成relase的代码.

         所以, 我们还要自己手动的在dealloc中release

     
  • 与生成只读、读写的封装.

         readwrite: 默认值.代表同时生成getter setter

         readonly: 只会生成getter 不会生成setter

     
  • @class与#import的区别

         1). #import是将指定的文件的内容拷贝到写指令的地方.

         2). @class 并不会拷贝任何内容. 只是告诉编译器,这是1个类,这样编译器在编译的时候才可以知道这是1个类.

     
  • 1. 当两个对象相互引用的时候.

         A对象的属性是B对象  B对象的属性是A对象.

         这个时候 如果两边都使用retain 那么就会发生内存泄露.

      2. 解决方案: 1端使用retain 另外1端使用assign 使用assign的那1端在dealloc中不再需要release了.

     

     

 

© 著作权归作者所有

共有 人打赏支持
盘盘的灰灰
粉丝 0
博文 31
码字总数 24142
作品 0
深圳
C/OC/Swift的数据类型没那么简单

数据类型决定了值如何存储到计算机内存中。在声明变量时也可指定它的数据类型。不同数据类型来存储不同的信息,所有变量都具有数据类型,以决定能够存储哪种数据。 C语言 C语言的基本数据类型...

CoderDancer
2017/08/10
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
OC . 语法

一、点语法作用 1、方便其他语言程序员很快转到OC开发 2、程序设计简单化 3、隐藏了内存管理细节 4、隐藏多线程、同步、加锁细节 当然是使用点语法 . 还是实用中括号的方式 [** **],随个人喜...

Cy_Star
2017/10/17
0
0
iphone开发技术要学习的内容

一.iOS基础   1 开发环境搭建以及IOS组件、框架的概要介绍。   2 mac操作系统与iOS操作系统   3 xcode IDE开发环境的初始   二.C语言基础   1数据类型、表达式与控制流程语句   ...

和谐中原植物酒
2015/08/24
138
2
iOS引用转换:Foundation与Core Foundation对象互相转换(__CFNSString转NSString,void *转id等等)

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

陈满iOS
05/10
0
0
iOS中的内存管理(上)

下列行为都会增加一个app的内存占用: 1、创建一个OC对象; 2、定义一个变量; 3、调用一个函数或者方法。 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户体验。如何让...

傲风凌寒
2014/05/20
0
0
OC语言自学《十一》---- OC(内存管理知识总结)

一、retain、release retain方法给对象的引用计数器+1 release方法给对象的引用计数器-1 retain方法会返回对象本身,release方法没有返回值 dealloc方法 当一个对象要被回收的时候会被调用 ...

罗眯眯
2014/04/06
0
0
简单说说面试

本文包括: OC的面向对象 运行时Runtime 运行循环RunLoop 事件响应链 引用计数 生命周期 与其他语言的区别 Objective-C 简称OC(下面以此代称),是在C语言的基础上,增加了一层最小的面向对...

天机
2016/08/17
5
0
简单说说面试

本文包括: OC的面向对象 运行时Runtime 运行循环RunLoop 事件响应链 引用计数 生命周期 与其他语言的区别 Objective-C 简称OC(下面以此代称),是在C语言的基础上,增加了一层最小的面向对...

天机
2016/08/17
5
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知识点总结

jq如何拿到data-info的自定义属性 1.1 原生可以获取到所有属性el.attrbutes 1.2 jq的$(el).attr('属性名称') 继承的几种方式,原型链 2.1 扩展原型对象实现继承 2.2 替换原型对象实现继承 2....

litCabbage
10分钟前
0
0
python语言规范

http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/...

ghou-靠墙哭
14分钟前
0
0
istio 监控,遥测 (理论)

Istio提供了一种灵活的模型来强制执行授权策略并收集网格中服务的遥测。 基础架构后端旨在提供用于构建服务的支持功能。它们包括诸如访问控制系统,遥测捕获系统,配额执行系统,计费系统等之...

xiaomin0322
16分钟前
0
0
阿里资深专家面试问题收集

corejava hashcode相等的两个对象一定相等吗?equals呢?反过来相等吗? 介绍一下集合框架? hashtable,hashmap底层实现是什么?hashtable和concurrenthashmap底层实现的区别? hashmap和treemap的...

undefine
17分钟前
6
0
alpine安装软件指定安装源

linux-alpine安装软件指定安装源 一、永久修改apk下载源地址 vi etc/apk/repositories 替换成阿里源 http://mirrors.aliyun.com/alpine/v3.8/main/http://mirrors.aliyun.com/alpine/v3...

我心中有猛狗
17分钟前
0
0
Centos7通过yum安装nginx

添加源地址(直接install可能不是最新版本的) sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 安装 sudo yum install -y ng......

iplusx
19分钟前
0
0
ef .core Dapper Helper

using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Threading.Tasks; using Dapper; using Dap......

Lytf
21分钟前
0
0
iOS 小笔记

1.以下代码打印什么     __block int val = 10;    void (^blk)(void) = ^{        printf("val=%d\n",val);        };       val = 2;    blk(); /...

风了个1
23分钟前
0
0
【Spring Boot 系列 Spring Boot示例程序】

入门程序步骤,创建一个Maven项目。继承Spring Boot官方提供的父工程。再引入一个Web的应用启动器。 1、选择一个合适的IDEA工具 创建一个Maven工程,并添加如下配置 <parent> <...

HansonReal
24分钟前
0
0
217. Contains Duplicate - LeetCode

Question 217. Contains Duplicate Solution 题目大意:判断数组中是否有重复元素 思路:构造一个set,不重复就加进去,重复返回true,如果数据量大的话,可以用布隆过滤器 Java实现: publ...

yysue
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部