使用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
的实例并没有强烈地引用它的所有者,所以当最后一个所有者最终被释放时,对象也是如此。