黑马程序员——OC的内存管理

来源:互联网 发布:python agent开发 编辑:程序博客网 时间:2024/06/09 16:34

  ——- android培训、java培训、期待与您交流! ———-

1.内存的创建和释放

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

id testObject = [[ClassName alloc] init];//“ClassName”是任何你想写的类名,比如NSString  NSArray等一切随意

注: alloc 是object-c 中常用来申请内存块的方式
此时,对于对象“testObject”来说,他的引用计数就是1了,原因就是他调用了alloc来创建了一块只属于他的内存,这样对象的引用计数就得+1. 另外,Object-c中的另两个关键字retaincopy也会将对象的引用计数+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新增两个武功高强的左右护法:strongweak

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

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

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

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

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

4.ARC机制的使用规则

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

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

  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,该创建的仍创建,该释放的仍释放。

0 0