Objective-C内存管理教程和原理剖析(二)口诀与范式

移动开发 iOS
范式就是模板,就是依葫芦画瓢。由于不同人有不同的理解和习惯,我总结的范式不一定适合所有人,但我能保证照着这样做不会出问题。谁创建,谁释放除了alloc,new或copy之外的方法创建的对象都被声明了autorelease,谁retain,谁release。

 

口诀与范式

1.口诀。

1.1谁创建,谁释放(类似于“谁污染,谁治理”)。如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放。
例如,你在一个函数中alloc生成了一个对象,且这个对象只在这个函数中被使用,那么你必须在这个函数中调用release或autorelease。如果你在一个class的某个方法中alloc一个成员对象,且没有调用autorelease,那么你需要在这个类的dealloc方法中调用release;如果调用了autorelease,那么在dealloc方法中什么都不需要做。

1.2除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。

1.3谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。有时候你的代码中明明没有retain,可是系统会在默认实现中加入retain。不知道为什么苹果公司的文档没有强调这个非常重要的一点,请参考范式2.7和第三章。

2.范式。
范式就是模板,就是依葫芦画瓢。由于不同人有不同的理解和习惯,我总结的范式不一定适合所有人,但我能保证照着这样做不会出问题。

2.1创建一个对象。

 

  1. ClassA *obj1 = [[ClassA alloc] init]; 

2.2创建一个autorelease的对象。

 

  1. ClassA *obj1 = [[[ClassA alloc] init] autorelease]; 

2.3Release一个对象后,立即把指针清空。(顺便说一句,release一个空指针是合法的,但不会发生任何事情)

 

  1. [obj1 release]; 
  2. obj1 = nil; 

 

2.4指针赋值给另一个指针。

 

  1. ClassA *obj2 = obj1; 
  2. [obj2 retain]; 
  3. //do something 
  4. [obj2 release]; 
  5. obj2 = nil; 

 

2.5在一个函数中创建并返回对象,需要把这个对象设置为autorelease

 

  1. ClassA *Func1() 
  2.   ClassA *obj = [[[ClassA alloc]init]autorelease]; 
  3.   return obj; 

 

2.6在子类的dealloc方法中调用基类的dealloc方法

 

  1. -(void) dealloc 
  2.          … 
  3.          [super dealloc]; 

 

2.7在一个class中创建和使用property。

2.7.1声明一个成员变量。

 

  1. ClassB *objB; 

2.7.2声明property,加上retain参数。

  1. @property (retain) ClassB* objB; 

2.7.3定义property。(property的默认实现请看第三章)

 

  1. @synthesize objB; 

2.7.4除了dealloc方法以外,始终用.操作符的方式来调用property。

self.objB 或者objA.objB

2.7.5在dealloc方法中release这个成员变量。

 

  1. [objB release]; 

示例代码如下(详细代码请参考附件中的memman-property.m,你需要特别留意对象是在何时被销毁的。):

 

  1. @interface ClassA : NSObject 
  2.          ClassB* objB; 
  3. @property (retain) ClassB* objB; 
  4. @end 
  5.  
  6. @implementation ClassA 
  7. @synthesize objB; 
  8. -(void) dealloc 
  9.          [objB release]; 
  10.          [super dealloc]; 
  11. @end 

 

2.7.6给这个property赋值时,有手动release和autorelease两种方式。

 

  1. void funcNoAutorelease() 
  2.          ClassB *objB1 = [[ClassB alloc]init]; 
  3.          ClassA *objA = [[ClassA alloc]init]; 
  4.          objA.objB = objB1; 
  5.          [objB1 release]; 
  6.          [objA release]; 
  7. void funcAutorelease() 
  8.          ClassB *objB1 = [[[ClassB alloc]init] autorelease]; 
  9.          ClassA *objA = [[[ClassA alloc]init] autorelease]; 
  10.          objA.objB = objB1; 

 

 

 

示例代码文件链接:http://files.cnblogs.com/VinceYuan/objective-c-memman.zip

 

责任编辑:闫佳明 来源: oschina
相关推荐

2011-07-19 15:15:09

Objective-C 内存

2011-07-21 09:42:27

Objective-C 内存 Autoreleas

2013-04-11 14:37:36

Objective-CiOS内存管理系统自动创建新的aut

2013-04-11 14:32:00

Objective-CiOS开发内存管理@synthesize

2013-04-11 13:57:27

Objective-CiOS开发内存管理

2011-07-18 17:14:16

Objective-C 内存 Cocoa

2011-07-29 16:08:31

Objective-C 内存

2011-07-27 17:10:30

Objective-C 持久化

2011-05-11 15:45:50

内存管理Objective-C

2011-07-20 17:04:43

Objective-C 内存 内存泄露

2011-07-21 10:10:42

Objective-C 内存 Autoreleas

2011-07-21 09:32:07

Objective-C 内存 Autoreleas

2011-08-16 17:43:47

Objective-C内存管理Autorelease

2011-08-01 11:37:41

iPhone Objective- 内存

2011-08-18 13:28:35

Objective-C内存

2011-07-08 13:49:46

Objective-C UUID

2011-08-05 14:03:39

Objective-C 对象 模板

2011-08-22 09:48:16

WindowsObjective-C

2011-08-16 10:23:04

Objective-CNSAutoreleaXcode常用键

2013-05-02 10:51:17

iOS开发Objective-C@property
点赞
收藏

51CTO技术栈公众号