您的位置:首页 > 移动开发 > Objective-C

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

2015-06-04 08:39 501 查看
1.内存的创建和释放

   让我们以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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS 内存管理