黑马程序员——OC语言 内存管理
Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
(以下内容是对黑马苹果入学视频的个人知识点总结)
(一)计数器
每个对象内部都保存了一个与之相关联的整数,称为引用计数器,当使用alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1
#import "Person.h" @implementation Person // 当一个Person对象被回收的时候,就会自动调用这个方法
- (void)dealloc
{
NSLog(@"Person对象被回收"); // super的dealloc一定要调用,而且放在最后面
[super dealloc];
} @end
2)内存的管理原则
1.谁创建,谁释放(“谁污染,谁治理”)。如果你通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放
2.一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
3.谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release
注意:
1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用
2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错
3)多个对象之间的内存管理
1>使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作)
2>你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release)
3>谁retain,谁release
4>谁alloc,谁release
int main()
{ Book *b = [[Book alloc] init]; Person *p1 = [[Person alloc] init]; [p1 setBook:b]; [p1 release];
p1 = nil; [b release];
b = nil;
return ;
}
(二)set方法的内存管理
内存管理代码规范:
1>只要调用了alloc,必须有release(autorelease)
对象不是通过alloc产生的,就不需要release
2>set方法的代码规范
① 基本数据类型:直接复制
- (void)setAge:(int)age
{
_age = age;
}
② OC对象类型
- (void)setCar:(Car *)car
{
// 1.先判断是不是新传进来对象
if ( car != _car )
{
// 2.对旧对象做一次release
[_car release]; // 3.对新对象做一次retain
_car = [car retain];
}
}
3.dealloc方法的代码规范
1> 一定要[super dealloc],而且放到最后面
2> 对self(当前)所拥有的其他对象做一次release
- (void)dealloc
{
[_car release];
[super dealloc];
}
(三) @property参数
*readwrite :同时生成set方法和get方法(默认)
*readonly :只会生成get方法
②setter处理:assign/retain/copy
@property (retain) Book *book;
*assign : 直接赋值,不做任何内存管理(默认,用于非OC对象类型)
@property (getter = isRich) BOOL rich; @property (nonatomic, assign, readwrite) int weight; @property (readwrite, assign) int height; @property (nonatomic, assign) int age; @property (retain) NSString *name;
2)开发中引用一个类的规范
1> 在.h文件中用@class来声明类
2> 在.m文件中用#import来包含类的所有东西
3)两端循环引用解决方案
1> 一端用retain
2> 一端用assign
#import <Foundation/Foundation.h>
#import "Card.h" @interface Person : NSObject @property (nonatomic, retain) Card *card; @end
(五) autorelease
1>autorelease的基本用法
① 会将对象放到一个自动释放池中
② 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
③ 会返回对象本身
④ 调用完autorelease方法后,对象的计数器不变
2>autorelease的好处
① 不用再关心对象释放的时间
② 不用再关心什么时候调用release
3>autorelease的使用注意
① 占用内存较大的对象不要随便使用autorelease
② 占用内存较小的对象使用autorelease,没有太大影响
4>错误写法
① alloc之后调用了autorelease,又调用release
黑马程序员——OC语言 内存管理的更多相关文章
- 黑马程序员——OC的内存管理学习小结
内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NS ...
- 黑马程序员_ Objective-c 内存管理笔记
引用计数器 当一个对象被创建出来,就要分配给内存这个对象,当不用这个对象的时候,就要及时的回收,为了可以明确知道对象有没有被使用,就要用引用计数器来体现,只要计数器不为0,表明对象被使用中. 1.方法 ...
- 黑马程序员——OC语言基础语法 面向对象的思想
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结)(一)基础语法 1)关键字 @interface.@implementati ...
- 黑马程序员——OC语言 核心语法(2)
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)id 1)简介:万能指针,能指向任何OC对象,相当于NSObject ...
- 黑马程序员——OC语言 类和对象
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)类 1)类的声明 代码编写 ①定义一个Car类,拥有2个属性:轮子数 ...
- 黑马程序员——OC语言 核心语法 (3)
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)分类Category 1) 基本用途 如何在不改变原来类模型的前提下 ...
- 黑马程序员——OC语言 三大特性之多态
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三大特性之一的多态 (一)多态的基本概念 OC对象具有多态性体现在 Per ...
- 黑马程序员——OC语言 三大特性之继承
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三大特性之继承 (一)继承的基本用法 先建立个Animal再用Dog继承前 ...
- 黑马程序员——OC语言Foundation框架 (2) NSArray NSSet NSDictionary\NSMutableDictionary
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)NSArray 1>NSArray :不可变数组 ①创建方法 ...
随机推荐
- 【转】PowerShell入门(八):函数、脚本、作用域
转至:http://www.cnblogs.com/ceachy/archive/2013/02/26/PoweShell_Function_Script_Scope.html 脚本所体现的是Powe ...
- Dynamics AX 2012 R2 RemoteApp导出项目报错
今天,Reinhard使用RemoteApp的方式登陆AX开发环境,对项目文件进行修改后,习惯性地将项目导出到Reinhard的电脑上,做个备份.但是导出时弹出错误提示框,报以下错误: ...
- Football Foundation (FOFO) TOJ 2556
The football foundation (FOFO) has been researching on soccer; they created a set of sensors to desc ...
- HDU 5690:2016"百度之星" - 初赛 All X
原文链接:https://www.dreamwings.cn/hdu5690/2657.html All X Time Limit: 2000/1000 MS (Java/Others) Mem ...
- Centos系统下Lamp环境的快速搭建(超详细,转)
lamp的搭建对于初学者是一件很头疼的事情,所以借此机会把自己当初快速搭建linux+apche+mysql+php的方法分享大家希望能到你. 工具/原料 虚拟机及Centos操作系统 Linux基本 ...
- 开启curl扩展(转)
一.win7系统32位, apache2.2, php5.2升级到5.4. 这个比较容易: 1. phpinfo发现没有加载curl; 2. 在php.ini中设置extension_dir 指向e: ...
- RMAN的实战篇--备份脚本
案列一. 目标: 1.每天夜间1 点执行:2.数据库全备,同时备份控制文件及归档日志文件,备份文件保存至: /backup\目录下,并在完成归档日志文件备份后,自动删除已备份的归档日志:3.备份保留7 ...
- [css] 页面重构“鑫三无准则” 之“无宽度”准则
原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]本文地址:http://www.zhangxinxu.com/wordpress/?p=1152 一 ...
- 【转载】CSS position属性和实例应用
目前几乎所有主流的浏览器都支持position属性("inherit"除外,"inherit"不支持所有包括IE8和之前版本IE浏览器,IE9.IE10还没测试 ...
- springboot
http://7player.cn/2015/08/30/%E3%80%90%E5%8E%9F%E5%88%9B%E3%80%91%E5%9F%BA%E4%BA%8Espringboot-mybati ...