我似乎还没遇到问题,但我正在努力确保使用一些最佳做法。
假设我有一个UITableViewController,其中包含一个MyObject对象的NSArray数据源。所以在我的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是用强声明的,谁知道可能还有另一个视图使用 strong 声明的相同MyObject。
底线:这是在视图之间传递对象的正确方法吗?我还没有在我的应用程序中使用弱引用,我觉得这是不对的。任何帮助或帮助链接都会很棒。
答案 0 :(得分:4)
这不是保留周期。这是一个很好的做事方式。 MyObject
的实例并没有强烈引用它的任何所有者,因此当最后一个所有者最终被释放时,该对象也将被释放。
答案 1 :(得分:4)
我认为你需要了解的是弧是如何工作的。
基本上任何指向它的强指针都会被保留。
这可以通过在对象中添加引用计数器来实现,所以当你这样做时:
@property (strong, nonatomic) MyObject *myObject;
为myObject创建一个STRONG指针(不是对象)。
但是当你这样做时
MyObject *myObject = [[self dataSource] objectForIndex:[indexPath row]];
你使这个指针增加引用计数来自该数据源的指定索引中的任何内容。
重要的是,只要指针指向这个对象,它就会保持活着。
关于您对观点的关注。
在界面构建器中创建的视图使用强指针在内部声明其元素。这是您想要使用弱引用的时候。当您将自己的IBOutlet添加到视图中的元素时,最好将其设置为弱。如果你从逻辑上考虑原因,它基本上意味着你不关心这个接口构建器元素,因为你只希望它存活直到取消分配viewcontroller。
当您经常遇到保留周期时,对象具有子对象,并且此子对象具有对其父对象的 STRONG 引用。
这是:
对象 A 使用强指针创建对象 B
对象 B 指向具有强指针的对象 A
A 会使 B 保持活力,而 B 会让 A 保持活着。
本页将向您解释一些关于如何避免此类内容的基本内容:
http://cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html
关于在视图之间传递对象,它非常简单。
首先得到一个从View 1到View 2的指针(可能强或弱,取决于谁应该保持视图2活着,如果它来自IB Builder它应该是弱的,如果它编程应该是强的)
其次,在视图2中创建一个属性(@property(强,非原子)MyObject * myObject;)
现在它很简单:
Self.view1Pointer.myObject = self.myOtherObject;
在这里理解两个视图是如何强烈指向此对象的,因此只要其中一个视图未被释放,该对象就会保持活动状态。
您不会创建保留周期,只需将该对象的引用计数设置为2。
注意:当视图被释放时,它的所有指针都设置为nil,因此它们指向的任何对象的引用计数都会减少。如果它达到0则被解除分配。 (在前一种情况下,myobject将为1,因为另一个视图仍然指向它)。
您创建保留周期的唯一方案是,您还设法将myObject点强烈设置为View2。所以现在他们互相活着。 (但正如前所述,你可以让myObject指向view2 弱,它不会创建一个保留周期)。
您可以在此处了解有关arc的更多信息:
http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1