引用计数器

每个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(内存管理)的更多相关文章

  1. Objective C内存管理之理解autorelease------面试题

    Objective C内存管理之理解autorelease   Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的A ...

  2. Objective C 内存管理[转]

    1  配对原则 alloc – release new – release retain - release copy – release 2  new和alloc-init的区别 (1)区别只在于a ...

  3. objective C 内存管理及属性方法具体解释

    oc为每一个对象提供一个内部计数器.这个计数器跟踪对象的引用计数,当对象被创建或拷贝时.引用计数为1.每次保持对象时,调用retain接口.引用计数加1.假设不需要这个对象时调用release,引用计 ...

  4. Objective -C Memory Management 内存管理 第一部分

    Objective -C Memory Management  内存管理  第一部分 Memory management is part of a more general problem in pr ...

  5. Objective C----手动管理内存和自动管理内存

    对象的引用计数(Reference Counting) 正常情况下,当一段代码需要访问某个对象时,该对象的引用的计数加1:当这段代码不再访问该对象时,该对象的引用计数减1,表示这段代码不再访问该对象: ...

  6. IOS学习笔记3—Objective C—简单的内存管理

    今天简述一下简单的内存管理,在IOS5.0以后Apple增加了ARC机制(Automatic Reference Counting),给开发人员带来了不少的方便,但是为了能更好的理解IOS内存管理机制 ...

  7. objective-c(内存管理)

    本文主要记录objective-c 内存管理的知识点: 1.objective-c的对象都是分配内存在堆上,与C的mallock和C++的new类似,只有int等系统变量分配内存在栈上: 2.obje ...

  8. iOS学习17之OC内存管理

    1.内存管理的方式 1> iOS应用程序出现Crash(闪退),90%的原因是因为内存问题. 2> 内存问题 野指针异常:访问没有所有权的内存,如果想要安全的访问,必须确保空间还在 内存泄 ...

  9. iOS - OC 内存管理

    1.OC 基本内存管理模型 1.1 自动垃圾收集 在 OC 2.0 中,有一种称为垃圾收集的内存管理形式.通过垃圾收集,系统能够自动监测对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对 ...

随机推荐

  1. 全网扫描扫描10000端口后的优化脚本&域名列表指定端口的批量测试

    方法一: #coding=utf-8 import urllib2 import threading from time import ctime,sleep print "Start-Ti ...

  2. 什么是FOUC?如何避免FOUC?///////////////////////////zzzz

     一个新的名词叫做 FOUC 浏览器样式闪烁,之前也听说过一些类似的东西,比如样式突变等等,但这东西竟然有学名的..什么是FOUC(文档样式短暂失效)?如果使用import方法对CSS进行导入,会导致 ...

  3. Prism 5 + MEF中的ModuleCatalog.CreateFromXaml问题

    protected override IModuleCatalog CreateModuleCatalog() { return Microsoft.Practices.Prism.Modularit ...

  4. maven私有库配置

    私有库的配置 协同开发过程中私有库可以为团队提升很大效率,之前我的私有库一直存在问题导致jar包导入异常.现在在这分享一下私有库配置的几个点,可能因为我们学校比较简陋所以配置的比较简单,欢迎大家补充 ...

  5. noi 1768 最大子矩阵

    题目链接:http://noi.openjudge.cn/ch0206/1768/ 可能是数据修改了吧,O(n6)过不了了. 主要是在求一个矩阵的和时,重复计算了很多次. 矩阵首先压缩一下.在输入的时 ...

  6. (7) 深入了解Java Class文件格式(六)

    转载:http://blog.csdn.net/zhangjg_blog/article/details/21888943 经过前几篇文章, 终于将常量池介绍完了, 之所以花这么大的功夫介绍常量池, ...

  7. 深入对比数据科学工具箱:Python和R之争

    建议:如果只是处理(小)数据的,用R.结果更可靠,速度可以接受,上手方便,多有现成的命令.程序可以用.要自己搞个算法.处理大数据.计算量大的,用python.开发效率高,一切尽在掌握. 概述 在真实的 ...

  8. [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)

    DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...

  9. SerialChat与Arduino的配合使用

    最近在开发过程中,用到了Arduino开发板以及其IDE:Arduino,这个IDE使用起来很方便,编码也很简单,但有一点美中不足的是Arduino只能输出数值,不能绘图,所以就用到了另外一款串口调试 ...

  10. [转](一)unity4.6Ugui中文教程文档-------概要

    转载请注明出处:http://blog.csdn.net/u010019717更全的内容请看我的游戏蛮牛地址:http://www.unitymanual.com/forum.php?mod=guid ...