使用ARC(强/弱)避免循环保留,学习一些基本知识

我似乎还没有遇到问题,但我正在努力确保我正在使用一些最佳做法。

说我有一个UITableViewController与一个NSArray的MyObject对象的数据源。 所以在我的UITableViewController我声明我的数据源如:

@property (strong, nonatomic) NSArray *dataSource; 

然后,当我触摸一个单元格时,我想推入一个显示某个细节视图的新视图,使用该单元格的MyObject。 所以在新的UIViewController我有这个:

 @property (strong, nonatomic) MyObject *myObject; 

现在在触摸一个单元格的UITableViewController中:

 MyObject *myObject = [[self dataSource] objectForIndex:[indexPath row]]; NewView *view = [[NewView alloc] initWithMyObject:myObject]; // ... push onto nav controller, etc 

基本上我害怕的是我的数组被声明为强壮的 ,详细视图中的MyObject声明为 ,谁知道也许有另一个视图与强壮声明相同的MyObject声明。

底线:这是在视图之间传递对象的正确方法吗? 我的应用程序还没有真正使用过弱引用,我觉得这是不对的。 任何帮助或链接来帮助将是惊人的。

我认为你需要了解的是弧线是如何工作的。

基本上任何有一个强大的指针指向它将被保留。

这是通过在对象中添加引用计数器来实现的,所以当你这样做的时候:

 @property (strong, nonatomic) MyObject *myObject; 

你为myObject(不是对象)创build一个STRONG指针。

但是当你这样做

 MyObject *myObject = [[self dataSource] objectForIndex:[indexPath row]]; 

你可以使这个指针增加引用计数,无论你在那个数据源的指定索引中有什么。

重要的部分是只要指针一直指向这个对象,它将保持活着。

关于你对这个意见的关注。

在界面生成器中创build的视图的内部元素都用强指针进行声明。 这是当你想使用一个引用。 当您将自己的IBOutlet添加到视图中的元素时,最好使其变弱。 如果你从逻辑上考虑这个原因,它基本上意味着你不关心这个接口构build器元素,因为你只希望它能够在viewcontroller被释放之前继续存在。

当你经常遇到保留周期的时候,一个对象有一个子对象,并且这个子对象对其父对象有一个STRONG引用。

这是:

对象A指针创build对象B.

对象B指针指向对象A.

A会让B活着, B会让A活着。

这个页面将向您解释一些关于如何避免这种东西的基本的东西:

http://cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html

另外关于在视图之间传递物体,这是非常非常简单的。

首先从视图1到视图2获得一个指针(根据谁应该保持视图2活着,可以是强或弱的,如果它来自IB Builder,则它应该是弱的,如果它在编程上应该是强的)

其次,在视图2中创build一个属性(@property(strong,nonatomic)MyObject * myObject;)

现在它是如此简单:

 Self.view1Pointer.myObject = self.myOtherObject; 

在这里了解两个视图如何强烈地指向这个对象,所以只要有一个视图没有被释放,对象就会保持活动状态。

你不会创build一个保留周期,你只需要将该对象的引用计数设置为2。

注意:当一个视图被释放时,它的所有指针都被设置为零,所以它们指向的任何对象的引用计数都会减less。 如果它达到0,它被释放。 (在之前的情况下,myobject会是1,因为另一个视图仍然指向它)。

您将创build一个保留周期的唯一场景是,如果您设法将myObject强制指向View2。 所以现在他们保持着彼此的生命。 (但正如之前所解释的,你可以使myObject指向view2,这将不会创build一个保留周期)。

你可以在这里了解更多关于arc:

http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

这不是一个保留周期。 这是一个很好的方式来做事情。 MyObject的实例并没有强烈地引用它的所有者,所以当最后一个所有者最终被释放时,对象也是如此。