所以遇到2个问题.如果我将superview和子视图引用强大,那么视图就会泄漏.如果我让他们变弱,他们根本就不会出现.我究竟做错了什么?
CustomUIView
@interface CustomUIView : UIView @property(nonatomic,strong) AnotherCustomUIView *mySubView; @end @implementation CustomUIView { - (void)initCommon { self.mySubView = [self createSubView] } - (AnotherCustomUIView *) createSubView { return [[AnotherCustomUIView alloc] init:self]; } @end
AnotherCustomUIView
@interface AnotherCustomUIView : UIScrollView @property (nonatomic,strong) CustomUIView *ownerView; @end @implementation AnotherCustomUIView - (id)init:(CustomUIView *) ownerView { self = [super init]; if (self) { self.ownerView = ownerView; self.delegate = self; } return self; } @end
解决方法
首先,这是对强弱对比的一个很好的描述:https://stackoverflow.com/a/11013715/700471
在您的特定情况下,AnotherCustomUIView上的ownerView属性应该是弱的,因为它指向一个高级对象.委托引用也很弱,我不知道设置self.delegate = self;有任何负面影响.
编辑:
为了澄清,将视图添加为另一个视图的子视图会创建一个强引用.一旦您的视图是视图层次结构的一部分,就不需要进一步强引用.所以你有这个代码:
[mySeniorView addSubView:myJuniorView]; // myJuniorView will not be released. mySeniorView.juniorView = myJuniorView; // This shouldn't be a strong reference.
在上面的代码中,如果mySeniorView.juniorView是一个强引用,它是多余的.如果从视图层次结构中删除myJuniorView,它将不会被释放,因为您仍然有另一个强引用.如果.juniorView是一个弱引用,那么从视图层次结构中删除myJuniorView将导致它取消分配并将.juniorView设置为nil.
这就是为什么,例如,所有的IBOutlet属性都应该很弱;因为你连接它们的xib中的东西是视图层次结构的一部分,因此不会dealloc因为它们的高级视图具有对它们的强引用.
所以,虽然我指出你的初级对象不应该强烈引用你的高级对象(没有人会解除分配;这被称为保留周期并导致内存泄漏)可能你的高级对象不应该强烈引用你的初级,除非你想让它闲逛,即使它不在视图层次结构中.毕竟这些是观点;我想说创建你的初级对象,将其弹出到视图层次结构中,然后在弱属性中保存对它的引用,这样只要存在它就可以访问它.然后,当您从视图层次结构中删除它时,您的引用会消失.
无论如何,希望有所帮助.