Objective-C(内存管理)
引用计数器
每个OC对象都有一个占4个字节存储空间的引用计数器
当使用或创建一个对象时,新对象的引用计数器默认是1
retain:可以使引用计数器+1
release:可以是引用计数器-1
retainCount:获得当前的引用计数器的值
当对象被销毁时,会重写dealloc方法
-(void)dealloc
{
// 这句必须放在最后面
[super dealloc];
}
僵尸对象:所占内存已经被回收的对象,僵尸对象不能再使用
野指针:指向僵尸对象(不可用的内存)的指针
错误:EXC_BAD_ACCESS :访问了一块坏的内存(已经被回收,不可用的内存)
空指针:没有指向任何东西的指针(储存的是nil、NULL、0),给空指针发消息不报错
多对象内存管理
1. 当使用(占用)某个对象就应该让对象的引用计数器+1
(让对象做一次retain操作)
2. 当不使用(占用)某个对象就应该让对象的引用计数器-1
(让对象做一次release操作)
3.谁retain,谁release
set方法的内存管理
内存管理代码规范:
1. 只要调用alloc,必须有release(autorelease),对象不是用alloc产生的,就不要写release
2.set方法的代码规范
1》基本数据类型:直接赋值
- (void)setAge:(int)age
{
_age = age;
}
2> 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];
}
1.set方法内存管理相关的参数
* retain : release旧值,retain新值(适用于OC对象类型)
* assign : 直接赋值(默认,适用于非OC对象类型)
* copy : release旧值,copy新值
2.是否要生成set方法
* readwrite : 同时生成setter和getter的声明、实现(默认)
* readonly : 只会生成getter的声明、实现
3.多线程管理
* nonatomic : 性能高 (一般就用这个)
* atomic : 性能低(默认)
4.setter和getter方法的名称
* setter : 决定了set方法的名称,一定要有个冒号 :
* getter : 决定了get方法的名称(一般用在BOOL类型)
@property 参数
OC对象类型:
@property (nonatomic, retain) 类名 *属性名;
@property (nonatomic, retain) Car *car;
@property (nonatomic, retain) id *car;
非OC对象类型
@property (nonatomic, assign) 类型名称 属性名;
@property (nonatomic, assign) int age;
@class Person;
@class的作用:告诉编译器,Person是一个类
开发中引用一个类的规范
1. 在.h文件中用@class来声明类
2. 在.m文件中用#import来包含类的所有东西
两端循环引用解决方案:
1》一端用retain
2》一端用assigh
autorelease
在ios程序运行过程中,会创建无数个池子,这些池子都是以棧结构存在(先进后出)
当对象调用autorelease方法时,会将这个对象放到棧顶的释放池
1. autorelease方法会返回对象本身
2. autorelease会把对象放到一个自动释放池
3. 当自动释放池被销毁时,会对池子里的所有对象做一次release操作
iOS 5.0 开始如下创建释放池:
@autoreleasepool
{// {大括号开始时就创建来自动释放池
} // }大括号结束代表销毁释放池
autorelease的使用注意:
1. 占用内存较大的对象不要使用autorelease
2. 占用内存较小的对象使用autorelease,没有太大影响
系统自带的方法里没有包含alloc、new、copy,说明返回的对象都是autorelease的
NSString:NS是前缀,Next Step
开发中经常会提供一些类方法,快速创建一个已经autorelease过的对象
例:
+ (id)Person
{
// 创建对象时不要直接用类名,一般用self
return [[[self alloc] init] autorelease];
}
ARC
Automatic Reference Counting
ARC的判断准则:只要没有强指针指向对象,就会释放对象
1.ARC特点
1> 不允许调用release、retain、retainCount
2> 允许重写dealloc,但是不允许调用[super dealloc]
3> @property的参数
* strong :成员变量是强指针(适用于OC对象类型)
* weak :成员变量是弱指针(适用于OC对象类型)
* assign : 适用于非OC对象类型
4> 以前的retain改为用strong
指针分2种:
1> 强指针:默认情况下,所有的指针都是强指针 __strong 下划线下划线strong
2> 弱指针:__weak 下划线下划线weak
错误写法(没有意义的写法):
__weak Person *p = [[Person alloc] init];
当两端循环引用的时候,解决方案:
1> ARC
1端用strong,另1端用weak
2> 非ARC
1端用retain,另1端用assign
Objective-C(内存管理)的更多相关文章
- Objective C内存管理之理解autorelease------面试题
Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的A ...
- Objective C 内存管理[转]
1 配对原则 alloc – release new – release retain - release copy – release 2 new和alloc-init的区别 (1)区别只在于a ...
- objective C 内存管理及属性方法具体解释
oc为每一个对象提供一个内部计数器.这个计数器跟踪对象的引用计数,当对象被创建或拷贝时.引用计数为1.每次保持对象时,调用retain接口.引用计数加1.假设不需要这个对象时调用release,引用计 ...
- Objective -C Memory Management 内存管理 第一部分
Objective -C Memory Management 内存管理 第一部分 Memory management is part of a more general problem in pr ...
- Objective C----手动管理内存和自动管理内存
对象的引用计数(Reference Counting) 正常情况下,当一段代码需要访问某个对象时,该对象的引用的计数加1:当这段代码不再访问该对象时,该对象的引用计数减1,表示这段代码不再访问该对象: ...
- IOS学习笔记3—Objective C—简单的内存管理
今天简述一下简单的内存管理,在IOS5.0以后Apple增加了ARC机制(Automatic Reference Counting),给开发人员带来了不少的方便,但是为了能更好的理解IOS内存管理机制 ...
- objective-c(内存管理)
本文主要记录objective-c 内存管理的知识点: 1.objective-c的对象都是分配内存在堆上,与C的mallock和C++的new类似,只有int等系统变量分配内存在栈上: 2.obje ...
- iOS学习17之OC内存管理
1.内存管理的方式 1> iOS应用程序出现Crash(闪退),90%的原因是因为内存问题. 2> 内存问题 野指针异常:访问没有所有权的内存,如果想要安全的访问,必须确保空间还在 内存泄 ...
- iOS - OC 内存管理
1.OC 基本内存管理模型 1.1 自动垃圾收集 在 OC 2.0 中,有一种称为垃圾收集的内存管理形式.通过垃圾收集,系统能够自动监测对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对 ...
随机推荐
- Python 面向对象编程进阶
静态方法 只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在 ...
- android-eclipse-phonegap 2..9以下(包含2.9)的项目配置
1.搭建android.eclipse环境,下载phonegap 2.9包 2.新建android项目 3.拷贝phonegap-2.9.0\lib\android\cordova-2.9.0.jar ...
- 你值得拥有:25个Linux性能监控工具
一.基于命令行的性能监控工具 1.dstat - 多类型资源统计工具 该命令整合了vmstat,iostat和ifstat三种命令.同时增加了新的特性和功能可以让你能及时看到各种的资源使用情况,从而能 ...
- ajax获取其他网站接口信息
MXS&Vincene ─╄OvЁ &0000023─╄OvЁ MXS&Vincene MXS&Vincene ─╄OvЁ:今天很残酷,明天更残酷,后天很美好, ...
- 什么是REST、RESTful
1.REST 指的是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是 RESTful. 2.REST 原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件.通过将系统知识限 ...
- VS2010调试Qt5的相关设置
1.windows环境,下载离线安装包安装: 2.安装Qt5 Visual Studio Add-in并安装: 3.环境变量里设置QTDIR=D:\LIB\Qt\Qt5.3.2\5.3\msvc201 ...
- calico docker 应用实例
在上一篇文章<quay.io/coreos/etcd 基于Docker镜像的集群搭建>中,介绍了ETCD集群的搭建.在此基础上,我们进一步实践calico docker的应用. PaaS ...
- HTML5新增元素、标签总结
总是遇到h5新标签的笔试题目,就查阅了资料来总结一下: 1.form相关: (1)form属性:在HTML5中表单元素可放在表单之外,通过给该元素添加form属性来指向目标表单(form属性值设为目标 ...
- 2015弱校联盟(2) - J. Usoperanto
J. Usoperanto Time Limit: 8000ms Memory Limit: 256000KB Usoperanto is an artificial spoken language ...
- (1) 第一章 Java体系结构介绍
1.网络带来的挑战和机遇 (1).挑战一: 网络包含的设备越来越广泛, 硬件体系不同, 操作系统不同,用途不同. java解决办法: 通过创建与平台无关的程序来解决这个问题.一个java程序可以不需要 ...