object-c(oc)内存管理机制详解

转载 2016年08月29日 16:51:14

转自:http://www.cnblogs.com/langtianya/p/3722398.html

1.内存的创建和释放

   让我们以Object-c世界中最最简单的申请内存方式展开,谈谈关于一个对象的生命周期。首先创建一个对象:

1
2
3
//“ClassName”是任何你想写的类名,比如NSString  NSArray等一切随意
id testObject = [[ClassName alloc] init];
注: alloc 是object-c 中常用来申请内存块的方式

此时,对于对象“testObject”来说,他的引用计数就是1了,原因就是他调用了alloc来创建了一块只属于他的内存,这样对象的引用计数 就得+1. 另外,Object-c中的另两个关键字retain和copy也会将对象的引用计数+1.根据Object-c的内存管理机制,我们在使用完 “testObject”后,需要释放它。

[testObject release];

release后的对象,虽然已经释放,但是他的指针地址仍然存在,只是指向了一块已经释放且无用的内存,所以我们建议release后直接赋个nil来置空。

一般,如果我们能知道需要实现功能所涉及的“className”的具体类名,就不建议使用init方法去初始化,比如以下代码:

NSString *strTest=[[NSString alloc] initWithString:@"test"]; (推荐)
NSString *strTest=[[NSString alloc] init];  (不推荐)

2.类方法和实例方法

简单来说,实例方法就是得有了具体实例(对象)后才能使用的方法,一般以减号形式作为方法的前缀来声明,比如API定义

-(id)initWithString:(NSString *)aString;

相比而言,类方法则无需具体对象,只需要类的名称即可调用,一般以加号形式作为方法的前缀来声明,比如API定义:

+(id)stringWithString:(NSString *)aString;

大可以将类方法理解为静态方法,类方法在对象还没创建出来之前已经有了。

3.属性关键字

@property (nonatomic, assign) int B;
@property (nonatomic, retain) id classObj;

可以看到关键之@property后的括号出现了四个特征性关键字:nonatomic , assign , retain , settet, 这些关键字直接告诉编译器后面的变量用何种方式来存取。

属性关键字 使用范围 释义 是否是默认值 小贴士
assign 赋值方式 不复制不保留,直接赋值 YES

基本数据类型和本类不直接拥有的对象

retain 赋值方式 将新值保留一份赋覆盖原值 NO 大部分对象可使用
copy 赋值方式 将新值复制一份赋覆盖原值 NO 字符串选择性使用
readwrite 读写权限 生成getter和setter两个方法 YES 变量可读取可修改
readonly 读写权限 只生成getter方法 NO 变量只读不可修改
atomic 原子性 原子操作 YES 可以保留在多线程环境下,能安全的存取值
nonatomic 原子性 非原子操作 NO 不生成多线程同步内容
getter 存取方法 自定义取方法 NO  
setter 存取方法 自定义赋值方法 NO  

关于nonatomic,如果我们能确定不需要多线程访问时,强烈推荐使用这个关键字,因为atomic对于性能的损失相对较大

如果是类的delegate,推荐使用assign关键字,原因是避免了retain的死循环造成的对象无法真正的释放

3.ARC新增关键字 

   ARC新增两个武功高强的左右护法:strong 和 weak

   strong的含义和retain相同,weak和assign相同,修饰完的属性变量用法也是完全没有改变,不过strong和weak只能修饰对象。

   

   苹果官方对于ARC机制中对象的内存引用规则:

    (1)任何对象,如果仍有持有者,就不会销毁

    (2)任何对象,已经没有任何持有者,即自动销毁

  持有者就是指向对象的指针,如果是strong修饰的,即是对象的持有者,如果是weak属性的,则不是持有者

4.ARC机制的使用规则

   对于ARC机制的使用,苹果发布了几条重要的规则需要开发者遵守。单单看那些生搬硬套的东西难免生涩,根据开发经验将规则总结如下:

   (1)不能调用dealloc,不能重写和调用retain,release,retainCount 和autorelease,同理,@selector(retain),@selector(release)这些曲线救国的方法也不能调用。 dealloc虽然能够重写,但是不能调用[super dealloc]之类的方法,CoreFoundation框架由于非从属cocoa框架,所以CFRetain和CFRelease仍然正常使用。

   (2)不能使用NSAllocateObjec或NSDeallocateObject函数来创建对象

   (3)不能在C语言的结构体中使用对象指针,同时建议用object-c的类来管理数据而不是结构体

   (4)不得使用NSAutoreleasePool对象。ARC中,全部使用@autorelease关键字代替,且比NSAutoreleasePool更高效

   (5)不得使用内存Zone,那些牵涉NSZone的方法都不得使用。

   (6)不得对一个属性变量的取值方法命名以new开头

   (7)outlet均用weak关键字修饰,除非他是xib中最顶部的界面元素,则需要strong。

   (8)Core Foundation不适合ARC,该创建的仍创建,该释放的仍释放。

http://www.cnblogs.com/haibosoft/p/3656290.html

相关文章推荐

object-c(oc)内存管理机制详解

object-c(oc)内存管理机制详解 1.内存的创建和释放    让我们以Object-c世界中最最简单的申请内存方式展开,谈谈关于一个对象的生命周期。首先创建一个对象: ...
  • hnjyzqq
  • hnjyzqq
  • 2014年09月27日 22:24
  • 353

OC_浅谈Object-C的内存管理机制

和C++一样通过内存操作获得的空间在使用完毕后需要释放内存否则就会造成内存泄露,接下来就让我们一起看看OC的内存管理机制; 首先我们知道oc的内存管理分为两部分:1、自动内存管理。2、手动内存管理。好...

object-c学习之内存管理机制

版权声明 此文版权归作者VinceYuan (vince.yuan#gmail.com)所有。欢迎非营利性转载,转载时必须包含原始链接http://vinceyuan.cnblogs.com/,...

黑马程序员--Object-C和Swift内存管理机制

内存管理是程序设计中常见的资源管理的

IOS开发基础Object-C(09)—OC内存管理(3)-@property的参数详解

在 IOS开发基础Object-C(06)—@property 和@synthesize语法中我们已经大体了解了@property的参数,今天我们就来详细解释一下@property关于内存管理的用法。...

IOS开发基础Object-C(07)—OC内存管理(1)-retain和release

前面我们已经说过,OC不同于Java的地方就是没有垃圾回收机制,在内存管理这块,cocoa引入了一种称为引用计数(reference counting)的技术,有时也叫保留计数,每个对象有一个与之对关...

object-c内存管理详解

一、理解autorelease:       引用:http://www.cocoachina.com/bbs/read.php?tid=38763&page=7         如果你能够真正的...

IOS开发基础Object-C(08)—OC内存管理(2)-对象之间的内存管理

前几天,我们学习了内存管理的基本知识,了解了内存管理的基本原理。那么,今天我们来学习一下对象之间的内存管理,看看对象之间是如何进行内存管理的。首先,我们新建两个类:Student和Book类,在Stu...

<center>oc内存管理机制<:center>

详谈OC内存管理概念为什么要进行内存管理 因为移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:object-c(oc)内存管理机制详解
举报原因:
原因补充:

(最多只允许输入30个字)