技术开发 频道

Objective-C内存管理入门系列篇

  十、对象的拥有者

  面向对象领域里有个引用的概念,区别于继承,引用常被用来当做偶合性更小的设计。继承是强依赖,对吧。我们要降偶软件的设计,就要尽量减少对它的使用。但没有任何偶合的模块或功能是没有用的~对吧,那我们只能多用引用了吧。一个实例拥有另一个实例的时候,我们称它为引用了另一个实例。

  比如ClassA类的一个属性对象的Setter方法:

  代码:

  - (void)setMyArray:(NSMutableArray *)newArray {

  
if (myArray != newArray) {

  [myArray release];

  myArray
= [newArray retain];

  }

  }

 

  假设这个类的一个实例为'a',调用setMyArray后,我们就可以说a拥有了一个新的myArray实例,也可以说a引用了一个新的myArray实例。其中调用的retain方法,使myArray的retainCount加一,我们需要注意以下两个地方:

  1,setMyarray方法中,在retain之前先release了旧实例一次

  2,在本实例的dealloc方法中,本应该是要再次release当前实例的,但回头看看参考内存管理准则。它并不合理,对吧。。。多了一次release。这里比较推荐的做法是:

  [myArray setMyArray:nil];

  这样可以巧妙的使当前实例release而不出错(我们可以向nil发送消息~其实它本身就是个整数0),并符合我们的内存管理准则。更主要的是,很简单,你不需要考虑过多的事情。

  另外一个比较容易忽略而又 比较经典的问题是实例变量的循环引用,Objective-C为此区分了,其实也相当相当的简单:

  1,强引用,上面讲的就是强引用,存在retainCount加一。

  2,弱引用,但凡是assign声明并直接用指针赋值实现的被称之为弱引用,不存在retainCount加一的情况。

0
相关文章